エスケープされていない文字を見つけるための正規表現

私は、 _x [0-9A-F] {4} _ の形式の16進数の文字が、 _x005F の前に(.Netを使用して)

私は [^(_ x005F)] _ x [0-9A-F] {4} _ を試しましたが、 _x005F _ > AA_x005F_x00FF_BB (この場合は何も一致させたくありません)。

0
@detunizedおっと、申し訳ありません、私はちょうど更新しました...
追加された 著者 Enigma State,
@今は同じように見える...
追加された 著者 Enigma State,
@ルーク:頭をアップしていただきありがとうございます。間違って2回投稿されました。私はモッズのために他の1つをすでに見せてくれました。
追加された 著者 Manuel,
@detunized:私は、OPはそれらの下線がそこにあることを意図していたと思う。
追加された 著者 Mark Byers,
@detunized:元のバージョンのソースにも下線が表示されています(フォーマットされたバージョンではイタリック体のテキストとして表示されます)。
追加された 著者 Mark Byers,
文字列が "AA_x005F_x005F_x00FF_BB"の場合、どのように一致させたいですか?
追加された 著者 Mark Byers,
@errorstacks、あなたは編集時に注意してください。元々そこになかったいくつかのアンダースコアを導入しました。
追加された 著者 detunized,
@MarkByers、彼の元のバージョンではありません。編集内容を確認します。
追加された 著者 detunized,
@MarkByers、それは=それを説明するok)
追加された 著者 detunized,

4 答え

ネガティブなルックバックを使用する必要があります。このような:

(?
1
追加された

あなたの質問はそれをはっきりさせるものではありませんが、2つの非常によく似た要件があるようです。

  • 前の文字が x005F の場合は一致しません。
  • 現在の文字が x005F の場合は一致しません。

これを試して:

"(?

完全な例:

string s = "AA_x0042_x005F_x00FF_x0043_BB";
foreach (Match match in Regex.Matches(s, "(?

出力:


_x0042_
_x0043_

See it working online: ideone

0
追加された
文字列リテラルのリテ​​ラルのバックスラッシュのように、 _x005F _ 自体は常にエスケープする必要がある(つまり _x005F_x005F _ )と仮定しているようです。しかし、この構文は、 _x005F _ が単独で使用できるように思われます。
追加された 著者 Alan Moore,
とにかく、サンプルの文字列では、 _x0042 __x00FF _ と一致するはずです。アンダースコアは _x0042 _ の一部であり、 _x0043 _ は16進文字ではないため、 _x005F はエスケープ文字ではありません。/code>は _x00FF _ に属します。
追加された 著者 Alan Moore,

What you're trying to do with [^(_x005F)] should be a negative lookbehind: (?. But it doesn't really work, for the reason Mark Byers pointed out: it incorrectly matches the leading _x005F_ in escaped hex sequences like _x005F_x00FF_.

しかし、私はMarkのソリューションに負の先読み機能を追加していません。彼の答えに私のコメントで説明したように、不正な形式のテキストは同期を外しているようだ。私は、16進数/エスケープシーケンスと同期している唯一の確実な方法は、エスケープされていない16進数のすべての文字列 を一致させることです。この正規表現は私のために働く:

\G(?>(?>(?:(?!_x[0-9A-F]{4}_).)+|_x005F_x[0-9A-F]{4}_)*)(_x[0-9A-F]{4}_)

私はそれがひどいと思うが、私と一緒に耐えなさい。 :Dここでは内訳です:

  • \G anchors the match to the beginning of the string on the first iteration, and to the position where the last match ended thereafter.

  • (?:(?!_x[0-9A-F]{4}_).)+ repeatedly consumes any character, unless the lookahead determines that it's the first character of hex sequence.

  • _x005F_x[0-9A-F]{4}_ consumes an escaped hex sequence.

  • (?>(?:(?!_x[0-9A-F]{4}_).)+|_x005F_x[0-9A-F]{4}_)* repeats those alternatives as many times as possible. When it quits, the next thing has to be the end of the string or an unescaped hex sequence, which will be captured in group #1 by...

  • (_x[0-9A-F]{4}_)

そしてオンラインデモがあり、その出力は次のとおりです:

abc_x0011_def_x005F__x0022_ghi_x005F_x0033_jkl_x0042_x005F_x00FF_x0043_mno
   ^^^^^^^   ^^^^^^^^^^^^^^                   ^^^^^^^     ^^^^^^^         

_x0011_
_x005F_
_x0022_
_x0042_
_x00FF_

末尾のアンダースコアのため、最初の _x005F _ は次の _x0022 _ をエスケープしません。私はそれがそれのように単独で立つことは大丈夫かどうかわかりませんが、なぜそうでなければならないのか分かりません。次の _x005F _x0033 _ をエスケープします。

サンプルの残りの部分は、私がMarkの解決策について間違っていると考えていることを示しています。しかし、それは間違っている私になる可能性があります。あなたが取り組んでいる言語の完全な構文はわかりません。

0
追加された

あなたは否定的なlookbehindを使用する必要があります:

(?

例えば:

(?

Edit - corrected answer

0
追加された
これはうまくいきません。あなたは否定的なlookbehindを使用する必要があります。
追加された 著者 detunized,
誰かが私が投稿している間に質問を編集:)必要に応じてアンダースコアを追加または削除する:)
追加された 著者 rslite,
おっと、そうです!
追加された 著者 rslite,