一点正则表达式帮助请.
为什么这些不同?
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)
我以为管道操作员不关心订单......或者可能有其他东西可以解释这个?
如果我做了一个疯狂的猜测,我会说它首先运行表达式的第一部分,然后是第二部分.所以,在第二种情况下发生的是它正在删除所有非数字部分,这意味着第二部分将永远不会匹配,并使您的扩展保持原样.
因为它必须首先运行表达式的某些部分,因为它不能同时运行,我会说这是一个相当自然的假设,虽然我可以看到为什么你可能会被抓住...绝对是一个有趣的尽管如此.
编辑:为了解决措辞,正如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"和字符串的其余部分被删除,留给我们什么也没有继续.