11

私が表現したいとしましょう\q(または他の特定の「バックスラッシュでエスケープされた文字」)。つまり、私は一致させたいが\q\\q後者はバックスラッシュでエスケープされたバックスラッシュの後にq. バックスラッシュでエスケープ\\\qされたバックスラッシュの後にバックスラッシュでエスケープされたq. \q(最初の ではなく、最後の に一致し\\ます。)

否定的な後読みが必要であることはわかっていますが、正規表現ではバックスラッシュ自体をエスケープする必要があるため、常に頭が混乱します。

4

4 に答える 4

19

更新:3つ以上のバックスラッシュをサポートする、新しく改良されたPerl正規表現:

/(?<!\\)#前に円記号が1つもありません
  (?> \\\\)*#偶数の円記号
  \\ q#その後に\ q
  /バツ;

または、正規表現ライブラリが拡張構文をサポートしていない場合。

/(?<!\\)(?> \\\\)* \\ q /

私のテストプログラムの出力:

qが一致しない
\qは一致します
\\qが一致しません
\\\qは一致します
\\\\qが一致しません
\\\\\qは一致します

古いバージョン

/(?:(?<!\\)|(?<= \\\\))\\ q /
于 2008-09-11T14:25:06.177 に答える
3

Leon Timmermansはまさに私が探していたものを手に入れました。後でここに来る人のために、小さな改善を1つ追加します。

/(?<!\\)(?:\\\\)*\\q/

?:グループの先頭に追加(\\\\)すると、一致データに保存されなくなります。そのテキストを保存したいシナリオは想像できません。

于 2008-09-11T15:12:47.077 に答える
0

2 つの問題があります。

簡単なパーサーを書くだけです。正規表現に頭がいっぱいになっている場合は、1 か月待ってください。

于 2008-09-11T13:52:04.667 に答える
-1

これに対する最善の解決策は、正規表現が実際に実行しようとしていることをサポートしていないため、独自の文字列解析を実行することです。(このように行けば、@ Frank Kruegerを担当してください、私は彼のアドバイスを繰り返しています)

しかし、私は排他的な正規表現を撃ちました。これは、「\」の後に文字が続くという基準に適合しないすべての文字列に一致します。

(?:[\\][\\])(?!(([\\](?![\\])[a-zA-Z])))
于 2008-09-11T14:24:01.093 に答える