質問

大丈夫だった正規表現はありますが、状況によってはうまくいかないことがあります

メッセージプレビューに注意を払うと、メッセージエディターは" \"を使用していくつかのトリッキーなことを行います

  

[\ []?[\ ^%#\ $ \ * @ \-;]。*?[\ ^%#\ $ \ * @ \-;] [\]]

そのタスクは、一般的にそのように見えるパターンを見つけることです

  

[ABA]

  • A-セット^、%、#、$、*、@、-、;からの文字
  • B-テキスト
  • [と]はパターンに含まれています

テスト文字列でこのパターンのすべての出現を見つけることが期待されます

  

Black fox [#sample1#] [%sample2%]-[#sample3#]はブロックを食べます。

ただし、予想される一致リストの代わりに

  • " [#sample1#]"
  • " [%sample2%]"
  • " [#sample3#]"

これを入手

  • " [#sample1#]"
  • " [%sample2%]"
  • "-[#sample3#]"

そしてこの問題は、セット" A"の他の文字でも発生するようです。だから誰かが私の正規表現に変更を提案して、必要に応じて機能させることができますか?

そしてそれほど重要ではない、そのようなパターンを除外するために正規表現を作成する方法

  

[ABC]

  • A-セット^、%、#、$、*、@、-、;からの文字
  • B-テキスト
  • C-セットからの文字^、%、#、$、*、@、-、; A以外
  • [と]はパターンに含まれています

たとえば

  

[$ sample1#] [%sample2 @] [%sample3;]

事前に感謝

MTH

役に立ちましたか?

解決

\[([%#$*@;^-]).+?\1\]

テキストに適用:

Black fox [#sample1#] [%sample2%] - [#sample3#] [%sample4;] eats blocks.

一致

  • [#sample1#]
  • [%sample2%]
  • [#sample3#]
  • ただし、 [%sample4;]

編集

これは私のために機能します(期待どおりに出力、正規表現は期待どおりにC#で受け入れられます):

Regex re = new Regex(@"\[([%#$*@;^-]).+?\1\]");
string s = "Black fox [#sample1#] [%sample2%] - [#sample3#] [%sample4;] eats blocks.";

MatchCollection mc = re.Matches(s);
foreach (Match m in mc)
{
  Console.WriteLine(m.Value);
}

他のヒント

最初の"?"の理由" [[]?"

\[[\^%#\$\*@\-;].*?[\^%#\$\*@\-;]\]

別の文字列を正常に検出します

より正確に:

\[([\^%#\$\*@\-;])([^\]]*?)(?=\1)([\^%#\$\*@\-;])\]

[ABA]を検出します

\[([\^%#\$\*@\-;])([^\]]*?)(?!\1)([\^%#\$\*@\-;])\]

[ABC]を検出します

開始角括弧のオプションの一致があります:

[\]]?

質問の2番目の部分(およびおそらく単純化するため)では、これを試してください:

\ [\%[^ \%] + \%\] | \ [\#[^ \#] + \#\] | \ [\ $ [^ \ $] + \ $ \]

この場合、可能な区切り文字ごとにサブパターンがあります。 |文字は" OR"であるため、3つのサブ式のいずれかが一致すると一致します。

各部分式は次のことを行います。

  • 開始ブラケット
  • 特殊文字
  • 特殊文字以外のすべて(1)
  • 特殊文字
  • クロージングバケット

(1)は、 ']'や '['などの除外を追加する必要がある場合があるため、次のような大きなテキスト全体で誤って一致しないようにします。

[%MyVar#]なんとか[$ OtherVar%]

ロブ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top