Clojureの正規表現でUnicode(UTF-8)文字を使用するにはどうすればよいですか?
質問
これは、驚くほど親切な積み重ねられたオーバーフローウィザードのための二重の質問です。
Clojureと話したり、コマンドラインREPLでUTF-8を使用するときにUTF-8を使用するようにEMACS/SLIME/SWANKを設定するにはどうすればよいですか?現時点では、ローマ以外のキャラクターをSwank-Clojureに送信することはできず、コマンドラインのRepl Gurblesの使用を使用することはできません。
ラテン語のテキストで正規表現を行うのは本当に簡単です:
(Reseq# [ w]+" "日本の文章がスペースを必要としないことは本当に本当ですか?")
しかし、もし私が日本人を持っていたらどうなりますか?私はこれがうまくいくと思ったが、私はそれをテストすることはできない:
(re-seq #"[(?u)\w]+" "日本語 の 文章 に は スペース が 必要 ない って、 本当?")
辞書を使用して単語の破損を見つけるか、カタカナのみの単語を自分で見つける必要がある場合、それは難しくなります。
(re-seq #"[アイウエオ-ン]" "日本語の文章にはスペースが必要ないって、本当?")
ありがとう!
解決
スワンクやエマックを助けることはできません、私は恐れています。 NetBeansでEnclojureを使用していますが、そこではうまく機能しています。
マッチングについて:アレックスが言ったように、 \w
英語以外のキャラクターでは機能しません。西ヨーロッパ向けの拡張ラテンの炭絵でさえありません。
(re-seq #"\w+" "prøve") =>("pr" "ve") ; Norwegian
(re-seq #"\w+" "mañana") => ("ma" "ana") ; Spanish
(re-seq #"\w+" "große") => ("gro" "e") ; German
(re-seq #"\w+" "plaît") => ("pla" "t") ; French
wは、拡張されたcharをスキップします。使用 [(?u)\w]+
代わりに、日本人と同じように違いはありません。
しかし、参照してください このregexリファレンス: \p{L}
カテゴリ文字のユニコード文字に一致するため、実際にはノルウェーで動作します
(re-seq #"\p{L}+" "prøve")
=> ("prøve")
日本語と同様に(少なくとも私はそれを読むことはできないと思いますが、それは球場にあるようです):
(re-seq #"\p{L}+" "日本語 の 文章 に は スペース が 必要 ない って、 本当?")
=> ("日本語" "の" "文章" "に" "は" "スペース" "が" "必要" "ない" "って" "本当")
他の多くのオプションがあります。その他のオプションは、ディクリティックマークなどを組み合わせることで、参照をチェックしてください。
編集:JavaのUnicodeの詳細
Unicodeを使用する際の潜在的な関心のある他のポイントへの迅速な参照。
幸いなことに、Javaは一般に、場所とプラットフォームの正しいエンコーディングでテキストを読み書きするのに非常に良い仕事をしていますが、時にはそれをオーバーライドする必要があります。
これはすべてJavaであり、このようなもののほとんどにはClojureラッパーがありません(少なくともまだ)。
- java.nio.charset.charset -US-ASCII、ISO-8859-1、UTF-8のような憲章を表します
- java.io.inputStreamReader - 読書時にバイトから文字列に翻訳するチャーセットを指定します。対応するoutputStreamWriterがあります。
- Java.lang.String - バイトの配列から文字列を作成するときに、charsetを指定します。
- Java.lang.Character - 文字のUnicodeカテゴリを取得し、Java CharsとUnicodeコードポイントの間で変換する方法があります。
- java.util.regex.pattern - ユニコードブロックとカテゴリを含む、正規表現パターンの仕様。
Javaキャラクター/文字列は内部的にUTF-16です。 char
タイプ(およびそのラッパー文字)は16ビットであり、これはすべてのUnicodeを表すのに十分ではないため、1つのシンボルを表すために2つの文字が必要です。
ラチン以外のユニコードを扱うとき、しばしば使用する方が良いです code points
文字ではなく。コードポイントは、intとして表される1つのユニコード文字/シンボルです。文字列と文字のクラスには、Java CharsとUnicodeコードポイントを変換する方法があります。
- unicode.org - ユニコード標準とコードチャート。
私は時々このようなものを必要としているので、ここにこれを置いていますが、ある時から次の時間までの詳細を実際に覚えておくのに十分な時間はありません。私の将来の自己へのメモのようなものであり、国際的な言語やエンコーディングからも始める他の人にとっても役立つかもしれません。
他のヒント
ここで半分の質問に答えます:
Clojureと話したり、コマンドラインREPLでUTF-8を使用するときにUTF-8を使用するようにEMACS/SLIME/SWANKを設定するにはどうすればよいですか?
よりインタラクティブな方法:
- MXカスタマイズグループ
- 「スライムリスク」
- スライムコーディングシステムのオプションを見つけ、UTF-8-UNIXを選択します。これを保存して、次のセッションでemacsがそれを拾います。
または、これを.emacsに配置します。
(custom-set-variables '(slime-net-coding-system (quote utf-8-unix)))
それがとにかくインタラクティブなメニューが行うことです。
EMACS 23およびで動作します 私のマシンで動作します
カタカナのために、 ウィキペディア ユニコードの順序付けを示します。カタカナをすべて捕まえた正規表現キャラクタークラスを使用したい場合は、次のようなことをすることができると思います。
user> (re-seq #"[\u30a0-\u30ff]+" "日本語の文章にはスペースが必要ないって、本当?")
("スペース")
hiragana、それが価値があることのために:
user> (re-seq #"[\u3040-\u309f]+" "日本語の文章にはスペースが必要ないって、本当?")
("の" "には" "が" "ないって")
正規表現が日本語の単語の休憩を検出できれば、私はかなり驚くでしょう。
国際的なキャラクターの場合、[ p {javalowercase} p {javauppercase}]+のようなJava文字クラスを使用する必要があります。
正規表現をプレフィックスします (?U)
そのようです: (re-matches #"(?U)\w+" "ñé2_hi") => "ñé2_hi"
.
これにより、Unicode_Character_ClassフラグをTrueに設定して、典型的な文字クラスが非ASCII Unicodeで必要なことを行うようにします。
詳細については、こちらをご覧ください。 http://docs.oracle.com/javase/8/docs/api/java/util/regex/pattern.html#unicode_character_class