我regex它是好的,但是因为它camed出不工作,以及在某些情况下

保持眼睛的消息预览会导致信息编辑做一些棘手的事情"\"

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

其任务是找到模式,在一般看起来像那样

[A]

  • A-char从设置^,%,#,$,*,@,-,;
  • B-有些文字
  • [和]被包括在模式

预期找到所有出现这种模式的测试串

黑色的福克斯[#sample1#][%sample2%]-[#sample3#]吃块。

但是,而不是预期的清单的比赛

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

我得到这个

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

它似乎是会发生这样的问题也与其他chars在设定"A"。所以可能有人建议改变我的regex使它的工作因为我需要吗?

和不太重要的事情,如何使我regex排除模式,这看起来像那样

[ABC]

  • A-char从设置^,%,#,$,*,@,-,;
  • B-有些文字
  • C-char从设置^,%,#,$,*,@,-,; 其他比
  • [和]被包括在模式

例如

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

在此先感谢

年月

有帮助吗?

解决方案

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

加案文:

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

比赛

  • [#sample1#]
  • [%sample2%]
  • [#sample3#]
  • 但不是 [%sample4;]

编辑

这对我的作品(产出不如预期,regex接受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);
}

其他提示

为什么第一个"?"in"[[]?"

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

将检测到你的种不同的字符串就好了

要更精确:

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

将检测[A]

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

将检测[ABC]

你有一个可选匹配的口方括:

[\]]?

第二部分的你的问题(并或许简化)试试这个:

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

在这种情况下,有一个子模式为每一可能的界定符。这|文字是"或者",因此它将符合如果任何的3次表达形式相匹配。

每个表达式将:

  • 开启支架
  • 特别Char
  • 一切,不是一个特殊char(1)
  • 特别char
  • 闭背面

(1)可能需要增加额外的排除样']"或"[',所以它不会不小心比赛跨过大量的文本,如:

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

Rob

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top