正規表現で[[.ch。]]はどういう意味ですか?


11

代替タイトル:POSIX準拠の正規表現の「照合シーケンス」または「照合要素」とは何ですか?

正確な技術的定義はPOSIX仕様のセクション9.3.5でリストの項目4として見つかりましたが、私にはあまり明確ではありません。

私は例と説明については、ウェブ上の周りGoogleで検索していない思い付い完全に手ぶらで、間違いなくありません啓発します

私が得た唯一のことは、特定の状況では、長さを比較し、「最長一致」が何であるかを決定するために、正規表現に複数の文字を単一の文字として処理させることができるということです(正規表現は貪欲であり、可能な限り最長の一致を返します)。

それだけですか?使い方がわからないのですが、理解が不十分だと思います。 正規表現の「照合」とは実際には何ですか? そして[[.ch.]]、POSIX仕様の例であるは、これとどのように関連していますか?

回答:


7

照合要素は通常、並べ替えのコンテキストで参照されます。

多くの言語では、照合(辞書のようにソート)は、文字ごとに行われるだけではありません。たとえば、チェコ語では、ch間にない並べ替えないcgci、それは英語でするように、しかし、ソートのため、全体として考えられています。それは(私たちはここに文字を参照することができない、文字が照合要素のサブセットである)の間でその種類の照合要素であるhi

今、あなたは尋ねることができます、それは正規表現と何をしているのですか?括弧式の照合要素を参照する必要があるのはなぜですか?

かっこ内では、順序を使用します。たとえばで[c-j]、あなたがしたい文字の間でcとをj。さて、あなたは?そこに要素を照合するほうがよいでしょう。[h-i]チェコ語ロケールでの一致ch

$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[h-i]o'
cho

したがって、大括弧式で照合要素の範囲をリストできる場合は、それらも個別にリストできるはずです。[a-cch]間でその照合要素と一致するだろうacし、cそしてh文字が。持っているa-cch照合要素、我々は新しい構文が必要になります。

$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[a-c[.ch.]]o'
cho

(その間のものacchもの)。

現在、世界はまだ完全ではなく、おそらく完全ではありません。上記の例はGNUシステム上にあり、動作しました。他の例照合要素があってもよいe(UTF-8で合成急性アクセントと$'e\u0301'同様に、レンダリング$'\u00e9'などé)。

éとéは同じ文字ですが、一方が1つの文字で表され、もう一方が2つの文字で表されます。

$ echo $'e\u301t\ue9' | grep '^[d-f]t'

一部のシステムでは正しく機能しますが、他のシステムでは機能しません(たとえば、GNUのシステムでは機能しません)。また、とのどちらか$'[[.\ue9.]]'のみを一致させる$'\ue9'か、または両方$'\ue9'を一致させる必要があるかは不明$'e\u301'です。

アルファベット以外のスクリプト、または、(ffi1文字)のような、地域ごとの並べ替え順序が異なるスクリプトは言うまでもなく、このような単純なAPIで処理するのは難しくなります。


1

これは、英語以外(非ASCII)の文字が使用されている場合に役立ちます。chあなたが言及する例は、有向グラフです。つまり、一部の言語にはアルファベットの文字があり、英語のアルファベットの2つの文字で表すことができます。

[.ch.]正規表現で使用する場合、基本的には次のように言います。「私は英語以外の入力シーケンスをchdigraphで期待しchます。regexpを単一の文字に一致させたいのです。私のプログラミング言語/正規表現エンジン/キーボードでは、このdigraph を書くことができません。記号なので、と入力し[.ch.]ます。の後にがc続くわけではありませんh。単一の文字としてダイグラフの出現のみを検索してください。」

[[.ch.]]ダイグラフが文字セットの一部であることを意味します。この場合、実際には1文字のみです。ちょうど標準的な正規表現表記。


ステファンの答えのように見えますch です、実際に二つの異なる文字。並べ替えの目的で1つとして扱われます。「ダイグラフ」が適切な用語であることを確信していますか?
ワイルドカード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.