正则表达式和管道操作员

Jef*_*ang 4 c# regex

一点正则表达式帮助请.

为什么这些不同?

Regex.Replace("(999) 555-0000 /x ext123", "/x.*|[^0-9]", String.Empty)
"9995550000"


Regex.Replace("(999) 555-0000 /x ext123", "[^0-9]|/x.*", String.Empty)
"9995550000123"
Run Code Online (Sandbox Code Playgroud)

我以为管道操作员不关心订单......或者可能有其他东西可以解释这个?

Mat*_*ley 7

如果我做了一个疯狂的猜测,我会说它首先运行表达式的第一部分,然后是第二部分.所以,在第二种情况下发生的是它正在删除所有非数字部分,这意味着第二部分将永远不会匹配,并使您的扩展保持原样.

因为它必须首先运行表达式的某些部分,因为它不能同时运行,我会说这是一个相当自然的假设,虽然我可以看到为什么你可能会被抓住...绝对是一个有趣的尽管如此.

编辑:为了解决措辞,正如Ben正确指出的那样,尝试从字符串中的每个字符开始匹配表达式.那么,第二种情况会发生什么:

  • 没有"^"锚点,所以我们尝试在每个子字符串的开头:
  • 对于"(999) 555-0000 /x ext123","("匹配[^0-9],所以替换一无所有(删除).
  • 因为"999) 555-0000 /x ext123",该"999"部分不匹配[^0-9],也不匹配/x.*,所以我们继续尝试")"匹配[^0-9],所以我们删除它.
  • 等等.当它到达时"/",同样的事情发生,它匹配[^0-9]并被删除,这意味着正则表达式的第二部分永远不会匹配.

在第一种情况下,会发生以下情况:

  • 再次,没有"^"锚,所以我们尝试所有子串:
  • 对于"(999) 555-0000 /x ext123","("不匹配/x.*,但它确实匹配[^0-9],因此将其替换为无(删除它).
  • 因为"999) 555-0000 /x ext123","999"部分不匹配/x.*,也不匹配[^0-9],所以我们继续尝试")",不匹配/x.*,但匹配[^0-9],所以我们删除它.
  • 当我们打"/x",这个时候/x.* 匹配,它匹配"/x ext123"和字符串的其余部分被删除,留给我们什么也没有继续.

  • 一个小小的狡辩; "运行"表达式使其声音(IMO)就像第一个替代方案是针对整个字符串运行,然后是第二个替代方案.事实上,在进入下一个角色之前,会测试每个替代方案.即测试顺序是"ABABAB",而不是"AAABBB".这个特定的例子没有区别,但在其他情况下,这种区别至关重要.:-) (3认同)