質問
大丈夫だった正規表現はありますが、状況によってはうまくいかないことがあります
メッセージプレビューに注意を払うと、メッセージエディターは" \"を使用していくつかのトリッキーなことを行います
[\ []?[\ ^%#\ $ \ * @ \-;]。*?[\ ^%#\ $ \ * @ \-;] [\]]
そのタスクは、一般的にそのように見えるパターンを見つけることです
[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%]
ロブ