我对正则表达式的微调有问题

时间:2008-11-16 08:45:40

标签: regex c#-2.0

我有正则表达式,但是因为它出来在某些情况下效果不佳

留意消息预览原因消息编辑器使用“\”执行一些棘手的操作

  

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

它的任务是找到一般看起来像

的模式
  

[ABA]

  • A - 来自set ^,%,#,$,*,@, - ,;
  • 的字符
  • B - 一些文字
  • [和]包含在模式中

预计会在测试字符串

中找到此模式的所有出现
  

黑狐狸[#sample1#] [%sample2%] - [#sample3#]吃块。

但不是预期的匹配列表

  • “[#sample1#]”
  • “[%SAMPLE2%]”
  • “[#sample3#]”

我明白了

  • “[#sample1#]”
  • “[%SAMPLE2%]”
  • “ -​​ [#sample3#]”

似乎这个问题也会在集合“A”中与其他字符一起出现。那么有人可以建议改变我的正则表达式以使其按我的需要工作吗?

并且不太重要的是,如何使我的正则表达式排除看起来像

的模式
  

[ABC]

  • A - 来自set ^,%,#,$,*,@, - ,;
  • 的字符
  • B - 一些文字
  • C - 来自set ^,%,#,$,*,@, - ,char的char 除A
  • 之外
  • [和]包含在模式中

例如

  

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

提前致谢

MTH

3 个答案:

答案 0 :(得分:3)

\[([%#$*@;^-]).+?\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 :(得分:1)

为什么第一个“?”在“[[]?”

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

会检测到你的不同字符串

更确切地说:

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

将检测[ABA]

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

将检测[ABC]

答案 2 :(得分:1)

您可以选择开头方括号:

[\]]

对于你问题的第二部分(也许是简化),试试这个:

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

在这种情况下,每个可能的分隔符都有一个子模式。 |字符是“OR”,因此如果3个子表达式中的任何一个匹配,它将匹配。

每个子表达式都将:

  • 打开支架
  • 特别字符
  • 一切不是特殊的char(1)
  • 特别字符
  • 关闭支持

(1)可能需要添加额外的排除,例如']'或'[',因此它不会意外地匹配大量文本,如:

[%MyVar#] blah blah [$ OtherVar%]

罗布