正则表达式与模式匹配或为空?

时间:2009-03-24 21:12:00

标签: regex

我需要与模式匹配的正则表达式或为空。

现在我有一个表达......

"\(?\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); }
}

这就是为什么我需要将解决方案放在一个表达式中。

3 个答案:

答案 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(或者可能是反斜杠之一)。

为了测试目的,我添加了^$个锚点;在验证器控件中,它们不应该被需要。