Apps Scriptリファレンス: Apps Script Reference |障害・課題追跡: IssueTracker |Google Workspace: Status Dashboard - Summary

ラベル 正規表現 の投稿を表示しています。 すべての投稿を表示
ラベル 正規表現 の投稿を表示しています。 すべての投稿を表示

2024年4月10日水曜日

英文から不要な記号を削除したい(正規表現)


今回やること


Hello, how's it going?


から不要な , と ? を削除して


Hello how's it going


にする。

2021年2月7日日曜日

正規表現でAND検索を試してみる3


のパターンを動的に作る方法を分解したコード。

"文字列1", "文字列2"を配列で渡して

こういう結果を得たくて書いたコードです。
 ^(?=.*文字列1)(?=.*文字列2)



コード.gs
function myFunction() {
  var values = ["文字列1", "文字列2"];
  var pattern = createAndSearchPattern(values);
  Logger.log(pattern);
}

function createAndSearchPattern(values) {
  var pattern = "^";
  for(var i = 0; i < values.length; i++) {
    pattern += "(?=.*" + values[i] + ")";
  }
  return pattern;
}



2019年12月19日木曜日

文章中にひらがなを含むかどうかを判定したい


matchとtestで試してみる

ひらがなの正規表現は
正規表現で文章からひらがなだけを抜き出したい /[ぁ-ゟー]+/g


matchで一致した文字列を返す
一致しなければnullを返す

コード.gs
function judgeIncudeHiraMatch() {
  var str = 'カタカナ漢字とeisu';
  var pattern = /.*[ぁ-ゟー].*/g;
  var result = str.match(pattern);
  Logger.log(result);
}


実行結果
「と」が含まれるので/.*[ぁ-ゟー].*/gに一致した文字列(前後の文字列を含む)を返す



testで一致したらtrue
一致しなければfalseを返す

コード.gs
function judgeIncudeHiraTest() {
  var str = 'カタカナ漢字eisu';
  var pattern = /.*[ぁ-ゟー].*/g;
  var result = pattern.test(str);
  Logger.log(result);
}


実行結果
ひらがな/.*[ぁ-ゟー].*/gに一致した文字列がないのでfalseを返す


関連記事

正規表現で文章からひらがなだけを抜き出したい /[ぁ-ゟー]+/g

2019年12月8日日曜日

複数のつながった英語の文章を単文に分けたい(正規表現)


こういうことがやりたくて書いたコード



左のテキストエリアに以下のようなテキストを貼り付けると
右のテキストエリアに一文ずつ改行して表示される。

Practice makes the impossible possible. Strike while the iron is hot.

Nothing comes of nothing.


デモ
https://script.google.com/macros/s/AKfycbxxqRidOTAUssCiWZBr-SxBriaB80i2MkLWEECL87ZtlsPVVRun/exec


今回書いた正規表現
var pattern = /.*?(?=[.!?] ).|[^。!?\n]*.|.*$/g;



コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile("index");
}
意訳
この機能がやること
指定したHTMLファイルを表示する




index.html
<!DOCTYPE html>
<html>
  <head>
    <style>
      textarea {
        width: 40vw;
        height: 80vh;
      }
    </style>
  </head>
  <body>
    <textarea id="ta"></textarea>
    <textarea id="ta2"></textarea>
    <script>
      elem("ta").onkeyup = taKeyup;
      
      function elem(id) {
        return document.getElementById(id);
      }
      
      function taKeyup() {
        var taStr = elem("ta").value;
        var singleSenteceArray = splitToSingleSentece(taStr);
        console.log(singleSenteceArray);
        elem("ta2").value = singleSenteceArray
      }
      
      function splitToSingleSentece(str) {
        var pattern = /.*?(?=[.!?] ).|[^。!?\n]*.|.*$/g;
        var sentences = str.match(pattern);
        var singleSentences = '';
        for(var i = 0; i < sentences.length; i++) {
          var sentence = sentences[i].trim();
          singleSentences += sentence + '\n';
        }
        return singleSentences
      }
    </script>
  </body>
</html>




備忘録

試しながら書いた正規表現

最初はこんな感じのを書いて、試しながらやってみた(これだと全然だめ)
var pattern = /.*\. *?.|.*\! *?.|.*\。*?.|.*\! *?.|.*/g;


.!?以外でいけそうな気がしたけれど、
3.14などの小数点やA.M.などのピリオドでも改行してしまう
var pattern = /[^.!?]*./g;


2019年11月16日土曜日

正規表現を使って、漢字+ひらがな1文字で区切りたい


デモ文章
正規表現を使って、漢字+ひらがな1文字で区切ってみたくなった。


上記文章を以下のように区切りたくて

正規表現を,使っ,漢字,文字で,区切っ


作った正規表現がこちら

/[々〆〇〻㐂-頻]+[ぁ-ゟー]|[々〆〇〻㐂-頻]+/g



漢字以外も後ろのひらがなを1文字だけくっつけて区切ってみたくなった。

デモ文章
正規表現を使って、漢字+ひらがな1文字で区切ってみたくなった。漢字以外の文字でもカタカナやハンカクの文字やabcやABCは異なり、数字の1と1も違う。


このように区切りたくて
正規表現を,使っ,て,漢字,ひらがな,1,文字で,区切っ,てみたくなった,漢字以外の,文字で,も,カタカナや,ハンカクの,文字や,abcや,ABCは,異な,り,数字の,1と,1も,違う


書いた正規表現がこちら
/[々〆〇〻㐂-頻]+[ぁ-ゟー]|[々〆〇〻㐂-頻]+|[ぁ-ゟー]+|[゠-ヿ]+[ぁ-ゟー]|[゠-ヿ]|[ヲ-゚]+[ぁ-ゟー]|[゠-ヿ]|[a-zA-Z0-9]+[ぁ-ゟー]|[a-zA-Z0-9]|[a-zA-Z0-9]+[ぁ-ゟー]|[a-zA-Z0-9]/g



関連記事

テキストを漢字、ひらがな、カタカナ、半角カタカナ、半角英数、全角英数に分割したい


デモ環境
正規表現を書いてmatchで抽出する

2019年10月13日日曜日

複数の文章を文章ごとに分けたい(正規表現)


複数の文章を各文章ごとに分けたくて書いた正規表現

var pattern = /。\n+|。|\.\n+|\. |\n+/g;


こういう複数の文章を
var value = '句点と改行で分割する。\n句点で分割する。Split by period. Split by period with newline.\n複数改行でも分割する。\n\n最後の文';

文章単位で配列に入れたい
 [句点と改行で分割する, 句点で分割する, Split by period, Split by period with newline, 複数改行でも分割する, 最後の文]



コード.gs
function myFunction() {
  var value = '句点と改行で分割する。\n句点で分割する。Split by period. Split by period with newline.\n複数改行でも分割する。\n\n最後の文';
  var pattern = /。\n+|。|\.\n+|\. |\n+/g;
  
  var sentences = value.split(pattern);
  Logger.log(sentences);
  
  for(var i = 0; i < sentences.length; i++) {
    var sentence = sentences[i];
    Logger.log(sentence);
  }
}

意訳
この機能がやること
複数の文章
句点と改行 or 句点 or ピリオドと改行 or ピリオドと半角スペース or 改行
  
valueをpatternで分割する
ログに出す
  
文章の数だけ繰り返す
文章ごとに
ログに出す





実行結果

こういうログが出ます。

[19-10-12 19:15:05:900 PDT] [句点と改行で分割する, 句点で分割する, Split by period, Split by period with newline, 複数改行でも分割する, 最後の文]
[19-10-12 19:15:05:901 PDT] 句点と改行で分割する
[19-10-12 19:15:05:901 PDT] 句点で分割する
[19-10-12 19:15:05:902 PDT] Split by period
[19-10-12 19:15:05:902 PDT] Split by period with newline
[19-10-12 19:15:05:903 PDT] 複数改行でも分割する
[19-10-12 19:15:05:903 PDT] 最後の文



2019年6月24日月曜日

オブジェクトの中から条件に一致する要素を抜き出す(AND検索)


以下のようなオブジェクトのプロパティ名 ja 中で「う」と「お」の両方含む値を取得したい



コード.gs
var obj = [
  {"en": "Aries", "ja": "おひつじ座"},
  {"en": "Taurus", "ja": "おうし座"},
  {"en": "Gemini", "ja": "ふたご座"},
  {"en": "Cancer", "ja": "かに座"},
  {"en": "Leo", "ja": "しし座"},
  {"en": "Virgo", "ja": "おとめ座"},
  {"en": "Libra", "ja": "てんびん座"},
  {"en": "Scorpius", "ja": "さそり座"},
  {"en": "Sagittarius", "ja": "いて座"},
  {"en": "Capriconus", "ja": "やぎ座"},
  {"en": "Aquarius", "ja": "みずがめ座"},
  {"en": "Pisces", "ja": "うお座"}
]

var pattern;
function filter_obj() {
  var values = ['う', 'お'];
  pattern = getAndPattern(values);
  var filtered = obj.filter(judge);
  var result = get_result(filtered);
  Logger.log(result);
}

function judge(items) {
  var regexp = new RegExp(pattern);
  var judged = regexp.test(items["ja"]);
  return judged;
}

function get_result(filtered) {
  var result = [];
  for (var i = 0; i < filtered.length; i++) {
    result.push([filtered[i]["en"], filtered[i]["ja"]]);
  }
  return result;
}

function getAndPattern(values) {
  var pattern = '^';
  for(var i = 0; i < values.length; i++) {
    pattern += '(?=.*' + values[i] + ')';
  }
  return pattern;
}



実行結果

 [[Taurus, おうし座], [Pisces, うお座]]


関連記事

オブジェクトの中から条件に一致する要素を抜き出す(filter)(正規表現を使う)
正規表現でAND検索を試してみる2

正規表現でAND検索を試してみる2


正規表現でAND検索を試してみる1
でやったことをもっと効率的な

/^(?=.*文字列1)(?=.*文字列2)/

で試してみます


ABO に AとOが両方含まれるか

コード.gs
function getAndConditional() {
  var str = 'ABO';
  var regexp = /^(?=.*A)(?=.*O)/;
  var result = regexp.test(str);
  Logger.log(result);
}

実行結果は true


パターンを動的に作りたい

コード2.gs
function getAndConditional2() {
  var str = 'ABO';
  var values = ['A', 'O'];
  var pattern = '^';
  for(var i = 0; i < values.length; i++) {
    pattern += '(?=.*' + values[i] + ')';
  }
  Logger.log(pattern);
  var regexp = new RegExp(pattern);
  var result = regexp.test(str);
  Logger.log(result);
}


実行結果


参考

正規表現はこちらの記事を参考にさせていただきました
正規表現で論理積(AND)を実現する
https://qiita.com/n4o847/items/dbcd0b8af3781d221424


正規表現

正規表現パターンの記述

正規表現でAND検索を試してみる1


対象の文字列の中に指定した文字がすべて存在するか知りたい

対象の文字列がABOで


指定文字がAとOの場合:
  1. ABOの中にAが存在するかを見る
  2. 存在しなければfalseを返す
  3. 存在すればOが存在するか見る
  4. 存在しなければfalseを返す
  5. 存在すればtrueを返す

結果、5まで実行してABOの中にAとOは存在するのでtrueを返す


指定文字がACの場合:
  1. ABOの中にAが存在するかを見る
  2. 存在しなければfalseを返す
  3. 存在すればCが存在するか見る
  4. 存在しなければfalseを返す
  5. 存在すればtrueを返す

結果、4まで実行してABOの中にAは存在するが、Cは存在しないのでfalseを返す



コード.gs
function myFunction() {
  var str = 'ABO';
  var target = 'AO';
  var conjunction = getAndConditional(str, target);
  Logger.log(conjunction);
}

function getAndConditional(str, target) {
  var values = target.split('');
  for(var i = 0; i < values.length; i++) {
    var regexp = new RegExp(values[i]);
    if(regexp.test(str) === false) {
      return false;
    }
  }
  return true;
}

意訳
この機能がやること
対象の文字列
探したい文字列
対象の文字列の中に、探したい文字列がすべて含まれるか判定して
ログにtrue, falseで出力する


この機能がやること
targetの文字列を一つずつ分けて
文字数の数だけ繰り返す
/A/のパターンを作って
strの中に含まれなければ
falseを返す


最後までfalseが返らなければtrueを返す




ちょっと書き換えて、valuesを配列にして渡す
var values = ['A', 'O'];

コード2.gs
function myFunction() {
  var str = 'ABO';
  var values = ['A', 'O'];
  var conjunction = getAndConditional(str, values);
  Logger.log(conjunction);
}

function getAndConditional(str, values) {
  for(var i = 0; i < values.length; i++) {
    var regexp = new RegExp(values[i]);
    if(regexp.test(str) === false) {
      return false;
    }
  }
  return true;
}


補足

ABO の中に A があるかどうかは

function myFunction() {
  var str = 'ABO';
  var result = /A/.test(str);
  Logger.log(result);
}

上記のように書けるので
同じように B があるか、Oがあるかを繰り返し見ていく
ということをコード1, 2でやっています



関連記事

正規表現でAND検索を試してみる2

2019年5月10日金曜日

正規表現でOR(または)を使いたい


AまたはB を正規表現で表すと

A|B



AまたはBがstrに存在するかどうかをtrue, falseで返すと

/A|B/.test(str)


var str = 'ABCDEFG' なら true が返ってくる
var str = 'HIJKLMN' なら false が返ってくる


AまたはBがstrに存在するかしないかで処理を分けてみると

var str = '対象の文字列';


if(/A|B/.test(str)) {
  ある場合の処理
} else {
  ない場合の処理
}



コード.gs
function myFunction() {
  var str = '今日の天気';
  if(/今日|明日/.test(str)) {
    Logger.log('ある');
  } else {
    Logger.log('ない');
  }
}

意訳
この機能がやること
対象の文字列を用意する
strにあるかどうか調べたい文字列を|で区切る
見つかったときのメッセージをログに出す
ない場合は
見つからなかったときのメッセージをログに出す




var str = '今日の天気'; → ある
var str = '明日の天気'; → ある
var str = '昨日の天気'; → ない


関連記事

match, exec, test, searchの違いを知りたい

2019年4月30日火曜日

正規表現で英数以外のテキストの間にある半角スペースを削除したい


今回試した正規表現

/(?<![a-zA-Z0-9!?])[\s ](?![a-zA-Z0-9])/g



Good morning! お は よ!



Good morning! おはよ!

にする



コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile("index");
}
意訳
この機能がやること
指定したHTMLファイルを表示する




index.html
<!DOCTYPE html>
<html>
<body>
<script>
myFunction();
function myFunction() {
  var text = 'Good morning! お は よ!';
  text = text.replace(/(?<![a-zA-Z0-9!?])[\s ](?![a-zA-Z0-9!?])/g, "");
  console.log(text);
}
</script>
</body>
</html>



補足

.gs側では「SyntaxError: 量指定子 ? は無効です。」と出て ? は使えないようなので、.htmlでやっています。


テキスト画像をOCR化したときに改行が半角スペースになることがあり、その半角スペースを消したくて書きました。


var text = 'Good morning! お は よ!';
text = text.replace(/(?<![a-zA-Z0-9])[\s ](?![a-zA-Z0-9])/g, "");

=> Good morning!おはよ!

これだと ! のあとの半角スペースも消えるので


!と?も対象にして

/(?<![a-zA-Z0-9!?])[\s ](?![a-zA-Z0-9])/g,

としたのが今回試した正規表現です。


2018年6月9日土曜日

テキストエリア内の空行を削除したい






コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile("index");
}
意訳
この機能がやること
指定したHTMLファイルを表示する




index.html
<!DOCTYPE html>
<html>
  <body>
    <textarea id="ta" style="height:120px"></textarea>
    <button id="bt">空行削除</button>
    <script>
    var ta = document.getElementById("ta");
    ta.value = "\n\n一行目\n二行目\n\n\n三行目";
    var bt = document.getElementById("bt");
    bt.onclick = remove_blank_line;
    
    function remove_blank_line(){
      ta.value = ta.value.replace(/^\n/gm, "");
    }
    </script>
  </body>
</html>

意訳
 


テキストエリア
ボタン

idがtaの要素を取得
taにテキストを入れる
idがbtの要素を取得
btがクリックされたらremove_blank_lineを実行する

この機能がやること
ta内で先頭に改行がある場合はすべて複数行でも消す








2018年5月2日水曜日

文字列の中から漢字を抽出する正規表現を考えてみる /[々〆〇〻㐂-頻]+/g


本文がちょっと込み入っているので、まずは結果から書きます

今回書いた漢字を抽出する正規表現はこれ

/[々〆〇〻㐂-頻]+/g



調べてみると漢字の範囲は奥が深い

ひらがなやカタカナのように「ここからここまで」という始まりと終わりの文字がよくわからない

ひらがな:「あ」〜「ん」
カタカナ:「ア」〜「ン」
漢字:「?」〜「?」


今回調べて知ったこと・わかったこと等
  • 常用漢字やJIS第1水準〜第4水準の漢字を文化庁のホームページやwikipediaで知った
    (なんとなく知ってはいたが改めて調べて知った)
  • Unicodeは世界中の文字を1文字2バイトで65536字で表そうとしていた
    • でも65536字では足りないことに気づいた
  • 65536字では足りないので4バイトで1文字を表すサロゲートペアが作られた
  • 常用漢字の中で唯一のサロゲートペアは「𠮟」
    • ちなみに別の文字の「叱」は常用漢字ではないがJIS第1水準漢字
  • 今回書いた [㐂-頻] はJIS第1水準〜第4水準の漢字だけを絞っているわけではない
    • それ以外の漢字も範囲に含まれる
    • この範囲は個人的に絞ったものなので一般的ではない



今回書いた正規表現で一致させたい漢字
  • 㐂-頻の範囲に含まれるすべての漢字
    • 注意点としてはJIS第1水準〜第4水準の漢字だけではないということ
    • JIS第1水準〜第4水準の漢字を数値に置き換えて昇順に並び替えると先頭が 㐂 で末尾が 頻 ですが、その範囲内には第1〜第4に含まれない漢字も含まれる
    • サロゲートペアも含まれる
  • 々:上記の範囲に含まれないため直接追加
  • 〆:「しめ」「閉め」「締め」「絞め」「占め」などを表す
  • 〇:漢字のゼロ
  • 〻:現在は「々」で代用されることもある(上字の訓を繰り返す)

※JIS第1水準〜第4水準の漢字だけを抽出するにはこの正規表現では不十分です



Unicode 10.0 Character Code Charts
http://www.unicode.org/charts/ を見ると

2018/01/29現在以下のような種類があり今後ExtensionG以降も増えそう
  1. CJK Unified Ideographs (Han) Range: 4E00–9FEA 統一漢字
  2. CJK Extension-A Range: 3400–4DB5 拡張A
  3. CJK Extension B Range: 20000–2A6D6 拡張B
  4. CJK Extension C Range: 2A700–2B734 拡張C
  5. CJK Extension D Range: 2B740–2B81D 拡張D
  6. CJK Extension E Range: 2B820–2CEA1 拡張E
  7. CJK Extension F Range: 2CEB0–2EBE0 拡張F
  8. CJK Compatibility Ideographs Range: F900–FAFF 互換漢字
  9. CJK Compatibility Ideographs Supplement Range: 2F800–2FA1F 互換漢字補足
  10. CJK Radicals / KangXi Radicals Range: 2F00–2FDF 部首
  11. CJK Radicals Supplement Range: 2E80–2EFF 部首補足
  12. CJK Strokes Range: 31C0–31EF おそらく一画ごとの表
  13. Ideographic Description Characters Range: 2FF0–2FFF おそらく配置
CJKはChinese Japanese Koreanの頭文字


wikipediaでCJK統合漢字を見てみるとだいぶ複雑な歴史を経ている


16進数で表してみる


/[々〆〇〻㐂-頻]+/g



16進数で表す場合は、おそらくこのようになる

/[\u3005\u3006\u3007\u303b\u3402-\uFA6A\uD840-\uD869\uDC02-\uDFFF]+/g


それぞれの16進数が意味している文字は

3005:々
3006:〆
3007:〇
303B:〻
3402:㐂
FA6A:頻
D840:𠀋の上位サロゲート(範囲内のサロゲートペアの上位サロゲートで一番小さい)
D869:𪚲の上位サロゲート(範囲内のサロゲートペアの上位サロゲートで一番大きい)
DC02:𦐂の下位サロゲート(範囲内のサロゲートペアの下位サロゲートで一番小さい)
DFFF:𣟿の下位サロゲート(範囲内のサロゲートペアの下位サロゲートで一番大きい)


今回書いた正規表現を使って漢字を抽出してみる

コード.gs
function get_kanji(){
  var str = "abcABC123abcABC123かなカナカナ仮名ひらがなカタカナカタカナ漢字";
  var pattern = /[々〆〇〻㐂-頻]+/g;
  var result = str.match(pattern);
  Logger.log(result);
}
意訳
この機能がやること
探索対象の文字列を用意しておく
今回書いた漢字のパターン
一致するものを探して
ログに出す



実行結果




参考

Unicode 10.0 Character Code Charts
http://www.unicode.org/charts/


wikipedia
CJK統合漢字
https://ja.wikipedia.org/wiki/CJK%E7%B5%B1%E5%90%88%E6%BC%A2%E5%AD%97

常用漢字一覧
https://ja.wikipedia.org/wiki/%E5%B8%B8%E7%94%A8%E6%BC%A2%E5%AD%97%E4%B8%80%E8%A6%A7

漢字
https://ja.wikipedia.org/wiki/%E6%BC%A2%E5%AD%97


常用漢字表(平成22年内閣告示第2号)
http://www.bunka.go.jp/kokugo_nihongo/sisaku/joho/joho/kijun/naikaku/kanji/


日本漢字能力検定
級別漢字表
http://www.kanken.or.jp/kanken/outline/data/outline_degree_national_list.pdf

正規表現を書いてmatchで抽出する


正規表現を変数にして一致する文字を出力するUIを作ってみる


デモ




.match( )





コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile("index");
}
意訳
この機能がやること
指定したHTMLファイルを表示する




index.html
<!DOCTYPE html>
<html>
  <head>
    <style>
    .ta {
      width: 360px;
      height: 120px;
    }
    
    .flag {
      width: 60px;
    }
    
    .text_dimgray {
      color: dimgray;
    }
    
    .text_orange {
      color: darkorange;
      font-weight: bold;
      font-size: 16px;
    }

    .regexp {
      font-size: 16px;
    }
    </style>
  </head>
  <body>
    <label class="text_dimgray">この文字列の中から一致する文字列を探したい</label>
    <br>
    <textarea id="input" class="ta"></textarea>
    <br>
    <div class="regexp">.match(
      <label class="text_orange">/
        <input type="text" id="tb" class="text_orange" placeholder="一致させたい文字列">/ 
        <input type="text" id="tb_flag" class="flag text_orange" placeholder="g,i,m等">
      </label>) 
    </div>
    <br>
    <label class="text_dimgray">一致する文字列</label>
    <br>
    <textarea id="output" class="ta"></textarea>
    <script>
    var tb = document.getElementById("tb");
    var tb_flag = document.getElementById("tb_flag");
    var input = document.getElementById("input");
    var output = document.getElementById("output");
    
    tb.onkeyup = get_result;
    tb_flag.onkeyup = get_result;
    
    function get_result() {
      var target = tb.value;
      var flag = tb_flag.value;
      var pattern = new RegExp(target, flag);
      output.value = input.value.match(pattern);
    }
    </script>
  </body>
</html>
意訳
 



taのスタイル
幅
高さ


flagのスタイル
幅


text_dimgrayのスタイル
文字色


text_orangeのスタイル
文字色
文字の太さ
文字サイズ


regexpのスタイル
文字サイズ




ラベル

インプットエリア

正規表現を入力するエリア






ラベル

出力エリア

idがtbの要素を取得
idがtb_flagの要素を取得
idがinputの要素を取得
idがoutputの要素を取得

tbでキーが上がったらget_resultを実行する
tb_flagでキーが上がったらget_resultを実行する

この機能がやること
tbのvalue(正規表現)を取得して
tb_flagのvalue(フラグ)を取得して
正規表現のオブジェクトを作成して
output(出力エリア)に一致する文字列を出力する







2018年4月1日日曜日

正規表現で<p>hello</p>の中からhelloに一致させる


HTMLソースの中で hello を見つけて前後の文字も含めて抜き出したい


>と<に囲まれているhelloとその前後の文字を抽出する例


/[^>]*hello[^<]*/
>以外の文字がいくつあっても helloを見つけてその前後の文字を見て <以外の文字ならいくつあっても抽出する

<div>
<p>「hello world」</p>
</div>



補足


?を使って >の後のhello の直後までを抽出する例


/[^>]*hello.*?/
>以外の文字がいくつあっても helloを見つけてその前後をみて その後に続く文字がいくつあってもhelloの直後までを抽出する(つまり「helloまでを抽出する)

<div>
<p>hello world」</p>
</div>



helloから<の手前までを抽出する例


/hello[^<]*/
helloを見つけてその後に続く文字を見て <以外の文字の場合いくつあっても抽出する

<div>
<p>hello world」</p>
</div>



補足2


<p> を直前に持って < を直後に持つ文字列を抽出する例


/(?<=<p>).*?(?=<)/
<p>を見つけて その直後に続く文字を見て <の直前の文字までを抽出する
言い換えると
対象の文字列の直前が <p> であり 対象の文字列の直後が < である文字列を抽出する
・(?<=pattern)は、patternで指定した文字列が直前にあるかどうかを見て
・(?=pattern)は、patternで指定した文字列が直後にあるかどうかを見て
その条件を満たす文字列を抽出する

<div>
<p>hello world」</p>
</div>




<p> を直前に持たず < を直後に持たない文字列を抽出する例


/(?<!<p>).*(?!<)/g
対象の文字列の直前が <p> でなく 対象の文字列の直後が < でない文字列を抽出する
・(?<!pattern)は、patternで指定した文字列が直前にないことを確認して
・(?=pattern)は、patternで指定した文字列が直後にないことを確認して
その条件を満たす文字列を抽出する
一行ごとに改行が入っているためそれぞれの行末の>の直後は\n
gフラグを付けると3行とも一致する

<div>
<p>「hello world」</p>
</div>




参考
正規表現
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions

Online regex tester and debugger
https://regex101.com/

2018年3月30日金曜日

全角英数を半角英数にして大文字を小文字にする


全角英数→半角英数→小文字に変換するコードの備忘録


全角英数
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz



全角を半角にして
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz



大文字を小文字にする
0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz



コード.gs
function zen_han_lower() {
  var zen = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  var han = zen_han(zen);
  var lower = get_lower(han);
  Logger.log([zen, han, lower]);
}

function zen_han(zen) {
  var han = "";
  var pattern = /[A-Za-z0-9]/;
  for (var i = 0; i < zen.length; i++) {
    if(pattern.test(zen[i])){
      var letter = String.fromCharCode(zen[i].charCodeAt(0) - 65248);
      han += letter;
    }else{
      han += zen[i];
    }
  }
  return han;
}

function get_lower(han){
  var lower = han.toLowerCase();
  return lower;
}
意訳
この機能がやること
全角英数字を用意して
zen_han()に渡して半角にした結果を受け取って
それをget_lower()に渡して小文字にした結果を受け取って
ログに出す


この機能がやること
半角の入れ物を用意して
全角英数のパターンを用意して
受け取った全角文字列の数だけ以下を繰り返す
文字が全角英数なら
半角英数に変換して
hanに追加して
全角英数以外なら
そのままhanに追加する


出来上がったhanを返す


この機能がやること
受け取った半角英数を小文字にして
返す



実行結果




2018年3月21日水曜日

漢字、ひらがな、カタカナ、英数字を正規表現で区切る


入力した文字列から
指定したパターンに一致した文字と
一致しなかった文字を取得してみる

ということをやりたくて正規表現を使って書いてみた例です

今回書いたコードで使っている正規表現
漢字、ひらがな、カタカナ、半角カタカナ、半角英数、全角英数で区切りたくて
このように書いています

/[々〆〇〻㐂-頻]+|[ぁ-ゟー]+|[゠-ヿ]+|[ヲ-゚]+|[a-zA-Z0-9]+|[a-zA-Z0-9]+/g



テキスト入力欄にテキストを入力すると
正規表現で指定したパターンを元に
漢字、ひらがな、カタカナ、英数字、それ以外で分割されて
一致したテキストと一致しなかったテキストで分割される



デモ








コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile("index");
}
意訳
この機能がやること
指定したHTMLファイルを表示する




index.html
<!DOCTYPE html>
<html>
<head>
  <style>
    .card {
      width: 360px;
      padding: 15px;
      border-radius: 2px;
      border: solid 1px lightgray;
      box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3);
    }

    .center {
      text-align: center;
    }

    textarea,
    input[type='text'] {
      width: 95%;
      font-size: 15px;
      margin: 5px;
    }
  </style>
</head>
<body>
  <div class='card'>
    <p>
      <label>テキスト入力欄</label>
      <input type='text' id='keywords' class='text_midium'>
    </p>
    <p>
      <label>漢字、ひらがな、カタカナ、英数字に一致</label>
      <textarea id='ta'></textarea>
    </p>
    <p>
      <label>一致しない文字</label>
      <textarea id='ta2'></textarea>
    </p>
  </div>
  <script>
    var keywords = document.getElementById('keywords')
    var ta = document.getElementById('ta')
    var ta2 = document.getElementById('ta2')

    keywords.focus()
    keywords.onkeyup = split_text

    function split_text() {
      var str = keywords.value
      var pattern = /[々〆〇〻㐂-頻]+|[ぁ-ゟー]+|[゠-ヿ]+|[ヲ-゚]+|[a-zA-Z0-9]+|[a-zA-Z0-9]+/g
      var pattern2 = /[^々〆〇〻㐂-頻ぁ-ゟー゠-ヿヲ-゚a-zA-Z0-9a-zA-Z0-9]/g
      var result = str.match(pattern)
      var result2 = str.match(pattern2)
      ta.value = result
      ta2.value = result2
    }
  </script>
</body>
</html>
意訳
  



cardのスタイル
幅
内側の余白
角丸
枠線
影


centerのスタイル
水平方向の位置


textareaと
input type='text'のスタイル
幅
文字の起きさ
外側の余白






テキスト入力欄




一致した文字の結果を入れる欄



一致しなかった文字を入れる欄



idがkeywordsの要素を取得
idがtaの要素を取得
idがta2の要素を取得

文字の入力欄をフォーカスする
文字が入力されたらsplit_textを実行する

この機能がやること
入力された文字を取得する
漢字、ひらがな、カタカナ、半角カタカナ、半角英数字、全角英数字に一致するそれぞれの正規表現
一致しない正規表現
入力された文字からpatternに一致するものを抜き出す
一致しない者を抜き出す
taにresultを入れる
ta2にresult2を入れる








補足


Apps ScriptのHTML Serviceではindex.htmlのコードで問題なく動きました

しかし、このブログで利用しているBloggerのHTMLにJavaScriptを書いて試してみると意図したとおりに分割できませんでした


以下のように「、」も一致してしまう

これを解消するために
patternとpattern2をconsole.logで出力してみるとこうなっていました
〇 が &#12295;
゠ が &#12448;
になっている


このままでは使えないのでそれぞれを16進数にしてみる

〇 を \u3007
゠ を \u30a0
にして以下のようにpatternとpattern2のコードを置き換えてみるとうまくいきました

var pattern = /[々〆\u3007〻㐂-頻]+|[ぁ-ゟー]+|[\u30a0-ヿ]+|[ヲ-゚]+|[a-zA-Z0-9]+|[a-zA-Z0-9]+/g
var pattern2 = /[^々〆\u3007〻㐂-頻ぁ-ゟー\u30a0-ヿヲ-゚a-zA-Z0-9a-zA-Z0-9]/g

2018年3月6日火曜日

正規表現で文章からひらがなとカタカナを抜き出す


文章の中からひらがなとカタカナを検出する

ひらがなとカタカナのパターンを用意して一致する(又はしない)テキストをアラートに出してみる






コード.gsでログに出してみる


コード.gs
function get_hira_kana(){
  var str = "abcABC123abcABC123かなカナカナ仮名ひらがなカタカナカタカナ漢字";
  var pattern = /[ぁ-ゟー]+|[゠-ヿ]+/g;
  var result = str.match(pattern);
  Logger.log(result);
}
意訳
この処理は以下を実行する
探索対象の文字列
ひらがなまたはカタカナのパターン
一致するものを探して
ログに出す




実行結果


HTML Serviceで作ってみる


コード.gs
function doGet(){
 return HtmlService.createHtmlOutputFromFile("index"); 
}
意訳
この処理は以下を実行する
指定したHTMLファイルを表示する



index.html
<!DOCTYPE html>
<html>
<body>
  <textarea id="ta"style="width:360px;height:10em;"></textarea>
  <br>
  <label><input type="checkbox" id="cb">ひらがなカタカナ以外</label>
  <br>
  <button id="bt">実行</button>
  <script>
    var bt = document.getElementById("bt");
    var ta = document.getElementById("ta");
    var cb = document.getElementById("cb");
    bt.onclick = get_hira_kana;

    function get_hira_kana() {
      var value = ta.value;
      var cb_checkd = cb.checked;
      var result = get_result(value, cb_checkd);
      alert(result);
    }

    function get_result(str, flag) {
      var hira_kana = "[ぁ-ゟー]+|[゠-ヿ]+";
      var not_hira_kana = "[^ぁ-ゟー゠-ヿ]+";
      if (flag == true) {
        var target = not_hira_kana;
      }else{
        var target = hira_kana;
      }
      var pattern = new RegExp(target, "g");
      var result = str.match(pattern);
      return result;
    }
  </script>
</body>
</html>
意訳
 


テキストエリア
改行
ラベルとチェックボックス
改行
ボタン

idがbtの要素を取得する
idがtaの要素を取得する
idがcbの要素を取得する
btがクリックされたらget_joyoを実行する

この機能がやること
taの値を取得して
チェック状態を取得して
get_resultに渡す
返ってきたresultをアラートに出す


この機能がやること
ひらがなカタカナ
ひらがなとカタカナ以外
もしflagがtrueなら
targetを含まないパターンを作る
falseなら
targetを含むパターンを作る

正規表現オブジェクトを作り
resultに一致する結果を入れて
返す






試してみる


ひらがなとかたかなだけを取得する



文章の中からひらがなとカタカナ以外を検出する




関連記事

ひらがなを抜き出す /[ぁ-ゟー]+/g
カタカナを抜き出す /[゠-ヿ]+/g
new RegExp()を使ってパターンを作る

2018年3月4日日曜日

正規表現で文章から常用漢字だけを抜き出したい


文章の中から常用漢字を検出する

常用漢字の一覧を用意して一致する(又はしない)テキストをアラートに出してみる








コード.gs
function doGet(){
 return HtmlService.createHtmlOutputFromFile("index"); 
}
意訳.gs
この処理は以下を実行する
指定したHTMLファイルを表示する




index.html
<!DOCTYPE html>
<html>
<body>
  <textarea id="ta"style="width:360px;height:10em;"></textarea>
  <br>
  <label><input type="checkbox" id="cb">常用漢字以外</label>
  <br>
  <button id="bt">実行</button>
  <script>
    var bt = document.getElementById("bt");
    var ta = document.getElementById("ta");
    var cb = document.getElementById("cb");
    bt.onclick = get_joyo;

    function get_joyo() {
      var value = ta.value;
      var cb_checkd = cb.checked;
      var result = get_result(value, cb_checkd);
      alert(result);
    }

    function get_result(str, flag) {
      var target = "亜哀挨愛曖悪握圧扱宛嵐安案暗以衣位囲医依委威為畏胃尉異移萎偉椅彙意違維慰遺緯域育一壱逸茨芋引印因咽姻員院淫陰飲隠韻右宇羽雨唄鬱畝浦運雲永泳英映栄営詠影鋭衛易疫益液駅悦越謁閲円延沿炎怨宴媛援園煙猿遠鉛塩演縁艶汚王凹央応往押旺欧殴桜翁奥横岡屋億憶臆虞乙俺卸音恩温穏下化火加可仮何花佳価果河苛科架夏家荷華菓貨渦過嫁暇禍靴寡歌箇稼課蚊牙瓦我画芽賀雅餓介回灰会快戒改怪拐悔海界皆械絵開階塊楷解潰壊懐諧貝外劾害崖涯街慨蓋該概骸垣柿各角拡革格核殻郭覚較隔閣確獲嚇穫学岳楽額顎掛潟括活喝渇割葛滑褐轄且株釜鎌刈干刊甘汗缶完肝官冠巻看陥乾勘患貫寒喚堪換敢棺款間閑勧寛幹感漢慣管関歓監緩憾還館環簡観韓艦鑑丸含岸岩玩眼頑顔願企伎危机気岐希忌汽奇祈季紀軌既記起飢鬼帰基寄規亀喜幾揮期棋貴棄毀旗器畿輝機騎技宜偽欺義疑儀戯擬犠議菊吉喫詰却客脚逆虐九久及弓丘旧休吸朽臼求究泣急級糾宮救球給嗅窮牛去巨居拒拠挙虚許距魚御漁凶共叫狂京享供協況峡挟狭恐恭胸脅強教郷境橋矯鏡競響驚仰暁業凝曲局極玉巾斤均近金菌勤琴筋僅禁緊錦謹襟吟銀区句苦駆具惧愚空偶遇隅串屈掘窟熊繰君訓勲薫軍郡群兄刑形系径茎係型契計恵啓掲渓経蛍敬景軽傾携継詣慶憬稽憩警鶏芸迎鯨隙劇撃激桁欠穴血決結傑潔月犬件見券肩建研県倹兼剣拳軒健険圏堅検嫌献絹遣権憲賢謙鍵繭顕験懸元幻玄言弦限原現舷減源厳己戸古呼固股虎孤弧故枯個庫湖雇誇鼓錮顧五互午呉後娯悟碁語誤護口工公勾孔功巧広甲交光向后好江考行坑孝抗攻更効幸拘肯侯厚恒洪皇紅荒郊香候校耕航貢降高康控梗黄喉慌港硬絞項溝鉱構綱酵稿興衡鋼講購乞号合拷剛傲豪克告谷刻国黒穀酷獄骨駒込頃今困昆恨根婚混痕紺魂墾懇左佐沙査砂唆差詐鎖座挫才再災妻采砕宰栽彩採済祭斎細菜最裁債催塞歳載際埼在材剤財罪崎作削昨柵索策酢搾錯咲冊札刷刹拶殺察撮擦雑皿三山参桟蚕惨産傘散算酸賛残斬暫士子支止氏仕史司四市矢旨死糸至伺志私使刺始姉枝祉肢姿思指施師恣紙脂視紫詞歯嗣試詩資飼誌雌摯賜諮示字寺次耳自似児事侍治持時滋慈辞磁餌璽鹿式識軸七𠮟失室疾執湿嫉漆質実芝写社車舎者射捨赦斜煮遮謝邪蛇勺尺借酌釈爵若弱寂手主守朱取狩首殊珠酒腫種趣寿受呪授需儒樹収囚州舟秀周宗拾秋臭修袖終羞習週就衆集愁酬醜蹴襲十汁充住柔重従渋銃獣縦叔祝宿淑粛縮塾熟出述術俊春瞬旬巡盾准殉純循順準潤遵処初所書庶暑署緒諸女如助序叙徐除小升少召匠床抄肖尚招承昇松沼昭宵将消症祥称笑唱商渉章紹訟勝掌晶焼焦硝粧詔証象傷奨照詳彰障憧衝賞償礁鐘上丈冗条状乗城浄剰常情場畳蒸縄壌嬢錠譲醸色拭食植殖飾触嘱織職辱尻心申伸臣芯身辛侵信津神唇娠振浸真針深紳進森診寝慎新審震薪親人刃仁尽迅甚陣尋腎須図水吹垂炊帥粋衰推酔遂睡穂錘随髄枢崇数据杉裾寸瀬是井世正生成西声制姓征性青斉政星牲省凄逝清盛婿晴勢聖誠精製誓静請整醒税夕斥石赤昔析席脊隻惜戚責跡積績籍切折拙窃接設雪摂節説舌絶千川仙占先宣専泉浅洗染扇栓旋船戦煎羨腺詮践箋銭銑潜線遷選薦繊鮮全前善然禅漸膳繕狙阻祖租素措粗組疎訴塑遡礎双壮早争走奏相荘草送倉捜挿桑巣掃曹曽爽窓創喪痩葬装僧想層総遭槽踪操燥霜騒藻造像増憎蔵贈臓即束足促則息捉速側測俗族属賊続卒率存村孫尊損遜他多汰打妥唾堕惰駄太対体耐待怠胎退帯泰堆袋逮替貸隊滞態戴大代台第題滝宅択沢卓拓託濯諾濁但達脱奪棚誰丹旦担単炭胆探淡短嘆端綻誕鍛団男段断弾暖談壇地池知値恥致遅痴稚置緻竹畜逐蓄築秩窒茶着嫡中仲虫沖宙忠抽注昼柱衷酎鋳駐著貯丁弔庁兆町長挑帳張彫眺釣頂鳥朝脹貼超腸跳徴嘲潮澄調聴懲直勅捗沈珍朕陳賃鎮追椎墜通痛塚漬坪爪鶴低呈廷弟定底抵邸亭貞帝訂庭逓停偵堤提程艇締諦泥的笛摘滴適敵溺迭哲鉄徹撤天典店点展添転塡田伝殿電斗吐妬徒途都渡塗賭土奴努度怒刀冬灯当投豆東到逃倒凍唐島桃討透党悼盗陶塔搭棟湯痘登答等筒統稲踏糖頭謄藤闘騰同洞胴動堂童道働銅導瞳峠匿特得督徳篤毒独読栃凸突届屯豚頓貪鈍曇丼那奈内梨謎鍋南軟難二尼弐匂肉虹日入乳尿任妊忍認寧熱年念捻粘燃悩納能脳農濃把波派破覇馬婆罵拝杯背肺俳配排敗廃輩売倍梅培陪媒買賠白伯拍泊迫剝舶博薄麦漠縛爆箱箸畑肌八鉢発髪伐抜罰閥反半氾犯帆汎伴判坂阪板版班畔般販斑飯搬煩頒範繁藩晩番蛮盤比皮妃否批彼披肥非卑飛疲秘被悲扉費碑罷避尾眉美備微鼻膝肘匹必泌筆姫百氷表俵票評漂標苗秒病描猫品浜貧賓頻敏瓶不夫父付布扶府怖阜附訃負赴浮婦符富普腐敷膚賦譜侮武部舞封風伏服副幅復福腹複覆払沸仏物粉紛雰噴墳憤奮分文聞丙平兵併並柄陛閉塀幣弊蔽餅米壁璧癖別蔑片辺返変偏遍編弁便勉歩保哺捕補舗母募墓慕暮簿方包芳邦奉宝抱放法泡胞俸倣峰砲崩訪報蜂豊飽褒縫亡乏忙坊妨忘防房肪某冒剖紡望傍帽棒貿貌暴膨謀頰北木朴牧睦僕墨撲没勃堀本奔翻凡盆麻摩磨魔毎妹枚昧埋幕膜枕又末抹万満慢漫未味魅岬密蜜脈妙民眠矛務無夢霧娘名命明迷冥盟銘鳴滅免面綿麺茂模毛妄盲耗猛網目黙門紋問匁冶夜野弥厄役約訳薬躍闇由油喩愉諭輸癒唯友有勇幽悠郵湧猶裕遊雄誘憂融優与予余誉預幼用羊妖洋要容庸揚揺葉陽溶腰様瘍踊窯養擁謡曜抑沃浴欲翌翼拉裸羅来雷頼絡落酪辣乱卵覧濫藍欄吏利里理痢裏履璃離陸立律慄略柳流留竜粒隆硫侶旅虜慮了両良料涼猟陵量僚領寮療瞭糧力緑林厘倫輪隣臨瑠涙累塁類令礼冷励戻例鈴零霊隷齢麗暦歴列劣烈裂恋連廉練錬呂炉賂路露老労弄郎朗浪廊楼漏籠六録麓論和話賄脇惑枠湾腕";
      if (flag == true) {
        var pattern = new RegExp("[^" + target + "]+", "g");
      } else {
        var pattern = new RegExp("[" + target + "]+", "g");
      }
      var result = str.match(pattern);
      return result;
    }
  </script>
</body>
</html>
意訳.gs
  


テキストエリア
改行
ラベルとチェックボックス
改行
ボタン

idがbtの要素を取得する
idがtaの要素を取得する
idがcbの要素を取得する
btがクリックされたらget_joyoを実行する

この機能がやること
taの値を取得して
チェック状態を取得して
get_resultに渡す
返ってきたresultをアラートに出す


この機能がやること
特定する漢字
もしflagがtrueなら
targetを含まないパターンを作る
falseなら
targetを含むパターンを作る

resultに一致する結果を入れて
返す








試してみる


常用漢字だけを取得する




常用漢字以外を取得する(常用漢字以外をチェック)



関連記事

常用漢字一覧を一行にする
new RegExp()を使ってパターンを作る


2018年3月3日土曜日

new RegExp()を使ってパターンを作る


ひらがなだけを抜き出したい /[ぁ-ゟー]+/g では

このようにパターンを書きました
var pattern = /[ぁ-ゟー]+/g;


それを
new RegExp()を使って

[ぁ-ゟー]+
の部分を変数にして

このように書き換えたのが以下のコード.gsです
var target = "[ぁ-ゟー]+";
var pattern = new RegExp(target, "g");



コード.gs
function get_hiragana(){
  var str = "abcABC123abcABC123かなカナカナ仮名ひらがなカタカナカタカナ漢字";
  var target = "[ぁ-ゟー]+";
  var pattern = new RegExp(target, "g");
  var result = str.match(pattern);
  Logger.log(result);
}
意訳
この機能がやること
探索対象の文字列を用意しておく
パターンの対象の文字列を決めて
パターンを作って
一致するものを探して
ログに出す



関連記事

ひらがなだけを抜き出したい /[ぁ-ゟー]+/g


Latest post

Google Formsでクイズを作りたい

Googleフォームには回答を判定するクイズモードがあります 今回はそのクイズモードで回答の判定とフィードバックについて書いていきます 「クイズモード」の表記: 日本語の表記は「テストにする」ですが 英語の表記は「Make this a quiz」となっています この記事ではそれ...