我需要与模式匹配的正则表达式或为空。
现在我有一个表达......
"\(?\d{3}\)?[-\s.]?\d{3}[-\s.]\d{4}/x"
...匹配美国电话号码。但是,它对我正在测试的字符串是空的有效。如果字符串中包含任何值,则它必须与表达式匹配。
我还有其他模式符合美国邮政编码等需要相同条件的模式。
在同一个表达式中实现此目的的最佳方法是什么?
澄清:我在Microsoft的验证应用程序块中使用了RegexValidator。使用它的一个例子如下:
[StringLengthValidator(0, 100, MessageTemplate = "Email must be between {3} and {5}")]
[RegexValidator(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", MessageTemplate = "Valid Email Required.")]
public string EmailAddress
{
get { return _EmailAddress; }
set { SetValue<string>(ref _EmailAddress, value); }
}
这就是为什么我需要将解决方案放在一个表达式中。
答案 0 :(得分:30)
将整个正则表达式包裹在parens中并放置一个?最后:
(\(?\d{3}\)?[-\s.]?\d{3}[-\s.]\d{4}/x)?
答案 1 :(得分:1)
尝试使用(?:<your_regex>)?
包装正则表达式。
答案 2 :(得分:1)
试试这个:
@"^(?:(\()?\d{3}(?(1)\)|[-\s.])\d{3}[-\s.]\d{4})?$"
(?(1)\)|[-\s.])
部分是条件构造。它说“如果有一个'('在开头(我们知道因为组#1匹配的东西),在这里匹配')';否则匹配连字符,空格或点。”并且将整个事物包裹在(?:...)?
中允许它匹配一个空字符串,就像凯文所说的那样;如果这对你不起作用,你必须放错其中一个parens(或者可能是反斜杠之一)。
为了测试目的,我添加了^
和$
个锚点;在验证器控件中,它们不应该被需要。