特殊正则表达式的分析

时间:2010-02-24 09:05:26

标签: regex

我有一个看起来像这样的正则表达式:

a(|bc)

这个表达式完全匹配字符串“a”,但它与“abc”不匹配。括号中的表达式是什么意思?

修改 使用带有以下代码的C#:

Match m = Regex.Match(TxtTest.Text, TxtRegex.Text);
if (m.Success)
  RtfErgebnis.Text = m.Value;
else
  RtfErgebnis.Text = "Gültig, aber kein Match!";

“TxTTest”包含要测试的字符串(在本例中为“abc”)。 “TxtRegex”包含正则表达式(在本例中为“a(| bc)”)

“RtfErgebnis”显示“Gültig,aber kein Match!”这意味着,正则表达式是有效的,但给定的测试字符串不匹配。

旁注:

表达式

a(|bc)d

匹配“ad”以及“abcd”。那么为什么前一个表达式不匹配“abc”?

我对正常表达没有任何影响。我偶然发现了这个特例。我需要知道如何处理它以进行正则表达式解析和数据生成。

编辑2:

  

“RtfErgebnis”显示“Gültig,艾美   匹配!“这意味着,正则表达式是   有效,但给定的测试字符串没有   匹配。

我对传递的参数有一点错误,所以现在显示“a”,这是完全正确的。

4 个答案:

答案 0 :(得分:5)

管道的意思是“或”。你的第一个表达式是“a,后跟 nothing bc ”。因此,“a”是完全匹配,并且它不打算包括“bc”。

第二个表达式是“a,后跟 nothing bc ,后跟d”。在该版本中,匹配仅在完全选择所有内容到“d”时完成。

如果您希望它比 nothing 选项更喜欢“bc”选项,您可以重写表达式:

a(bc)?

表示“a,后面是零或一次出现bc”,在这种情况下,大多数引擎会将“abc”而不是“a”视为完全匹配。

答案 1 :(得分:3)

(|bc)中的空分支匹配任何内容但不使用字符,因为空表达式不描述任何字符。

交换分支,您将获得“最长”的匹配:

a(bc|)

这将与abcabc分支中的bc匹配,a中的ax(已采用空分支)。

答案 2 :(得分:1)

实际上(| bc)与abc匹配

perl -n -e 'print "Output:$_" if /a(|bc)/; '
a
Output:a
abc
Output:abc
bc

因此,(| bc)和a(| bc)d

之间没有不一致的行为

答案 3 :(得分:1)

(| ab)是否为此匹配组返回“”或“ab”的匹配取决于匹配的顺序,并且可能还取决于正在使用的正则表达式引擎。例如,在grep和sed中,如果顺序颠倒(ab |):

,则仅匹配ab
echo abc | sed -n 's/a\(\bc\|\)/\1/p'

以上回报:

bc

以下(| ab)不返回任何内容:

echo abc | sed -n 's/a\(\\|bc\)/\1/p'