我有一个看起来像这样的正则表达式:
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”,这是完全正确的。
答案 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|)
这将与abc
(abc
分支中的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 |):
,则仅匹配abecho abc | sed -n 's/a\(\bc\|\)/\1/p'
以上回报:
bc
以下(| ab)不返回任何内容:
echo abc | sed -n 's/a\(\\|bc\)/\1/p'