入力した文字列から
指定したパターンに一致した文字と
一致しなかった文字を取得してみる
ということをやりたくて正規表現を使って書いてみた例です
今回書いたコードで使っている正規表現
漢字、ひらがな、カタカナ、半角カタカナ、半角英数、全角英数で区切りたくて
このように書いています
/[々〆〇〻㐂-頻]+|[ぁ-ゟー]+|[゠-ヿ]+|[ヲ-゚]+|[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で出力してみるとこうなっていました
〇 が 〇
゠ が ゠
になっている
このままでは使えないのでそれぞれを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