【问题标题】:I've got problem with fine tuning of regex我对正则表达式的微调有问题
【发布时间】:2008-11-16 08:45:40
【问题描述】:

我有正则表达式,这很好,但是在某些情况下它出来时效果不佳

注意消息预览,因为消息编辑器使用“\”做了一些棘手的事情

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

它的任务是找到通常看起来像这样的模式

[ABA]

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

预计会在测试字符串中找到该模式的所有出现

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

但不是预期的匹配列表

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

我明白了

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

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

以及不太重要的事情,如何让我的正则表达式排除看起来像那样的模式

[ABC]

  • A - 字符集 ^,%,#,$,*,@,-,;
  • B - 一些文字
  • C - 字符集 ^,%,#,$,*,@,-,; A 以外的
  • [ 和 ] 包含在模式中

例如

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

提前致谢

MTH

【问题讨论】:

  • 我刚刚添加了正则表达式检测 ABA 和 ABC:你能确认它们对你有用吗?

标签: regex c#-2.0


【解决方案1】:
\[([%#$*@;^-]).+?\1\]

应用于文本:

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

匹配

  • [#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);
}

【讨论】:

  • 是的,但是如果不使用前瞻,您将如何检测 ABC? [^\1] 不起作用...
  • 好吧,c# RegEx 引擎似乎不喜欢这个表达式,可能是这个页面上的消息编辑器错误地解释了某些东西?
  • 好吧,再读一遍 - 匹配 ABC 是一项要求。我的正则表达式只匹配 ABA。无需前瞻。
  • 当然你是对的,在测试应用程序时,我为正则表达式启用了“ExplicitCapture”。所以组数不对,诊断信息没有给我线索,所以我检查了我的代码并更改了它,现在一切正常,感谢您的帮助
  • 那是你一直追求的,还是只是另一种方法?
【解决方案2】:

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

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

可以很好地检测到您的不同字符串

更准确地说:

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

将检测 [ABA]

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

将检测 [ABC]

【讨论】:

  • 好吧,看来我做了很多改变,以至于我错过了这个
【解决方案3】:

您有一个可选的左方括号匹配:

[\]]?

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

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

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

每个子表达式将:

  • 左括号
  • 特殊字符
  • 所有非特殊字符 (1)
  • 特殊字符
  • 关闭后台

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

[%MyVar#] 等等[$OtherVar%]

罗伯

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 2013-09-13
    • 1970-01-01
    • 2013-04-11
    • 2014-08-26
    相关资源
    最近更新 更多