1

次の emacs 正規表現が何を意味するのかお聞きしたいと思います (誰かが不思議に思っているなら、これは単一引用符で囲まれたアトムを照合するために erlang-mode が使用する正規表現です):

'\\(?:[^\\']\\|\\(?:\\\\.\\)\\)*'

具体的には、3 つのことについて説明を見つけるのに苦労しています。

まず、前の項目をオプションにするか、前の量指定子が遅延するように指定する必要があると思われる疑問符ですが、ここには項目も量指定子もなく、新しいグループの開始のみなので、ここでどのような影響がありますか?

2 つ目は、エスケープされたアポストロフィです。なぜアポストロフィをエスケープする必要があるのでしょうか?

第三に、四重エスケープ、これはエスケープされたバックスラッシュとそれを無効な正規表現にする\\.a を残していませんか?\.

ありがとう

4

2 に答える 2

2

"[^\\']"
2 つ目は、エスケープされたアポストロフィです。なぜアポストロフィをエスケープする必要があるのでしょうか?

まず、Emacs の正規表現構文で\`は、文字列の先頭と\'一致し、文字列の末尾と一致することに注意してください。複数行の文字列では、これは行頭と行末に一致するより馴染みのある^and とは異なります。$

ただし、これは代替文字 (角括弧) 内では関係ないため、このシーケンスは実際にはバックスラッシュまたはアポストロフィ以外の任意の文字に一致します。

編集:

コメントから、これはまだ混乱を引き起こしているので、それを分解しましょう:

"'\\(?:[^\\']\\|\\(?:\\\\.\\)\\)*'"

そのコードは、次の文字列/正規表現に評価されます。

'\(?:[^\']\|\(?:\\.\)\)*'

'アポストロフィに一致

\(?:foo\)*0 個以上に一致foo

foo\|barfooまたはのいずれかに一致bar

[^\']バックスラッシュまたはアポストロフィ以外の任意の文字に一致します

\(?:\\.\)(この場合、1 回だけ発生する非キャプチャ グループ) は単純\\.に に書き換えられ、バックスラッシュの後に改行以外の任意の文字が続くものと一致します。

'アポストロフィに一致

したがって、すべてが一重引用符で囲まれた文字列と一致します。

  • 他の一重引用符の前にはそれぞれバックスラッシュを付ける必要があります
  • バックスラッシュは、別の非改行文字 (バックスラッシュの場合もあります) とペアにする必要があります。

もちろん、バックスラッシュ自体や区切り引用符のインスタンスなど、バックスラッシュを使用して特殊文字をエスケープできる典型的な文字列構文のように聞こえます。

于 2012-08-15T05:35:07.917 に答える
0

最初:(?:キャプチャグループを作成せずに複数のトークンをグループ化します。これにより、グループ全体に数量詞を適用できます。

2番目と3番目は、それらはエスケープされたバーだと思います。各ペアはを意味\し、4つはを意味し\\ます。したがって、アポストロフィをまったく使用しません。

于 2012-08-13T12:37:33.703 に答える