Какое регулярное выражение будет соответствовать шаблону или быть пустым?

Мне нужно регулярное выражение, которое соответствует шаблону или пустое.

Сейчас у меня есть выражение...

"\(?\d{3}\)?[-\s.]?\d{3}[-\s.]\d{4}/x"

..., который соответствует номерам телефонов США. Тем не менее, он действителен для строки, которую я тестирую, пустой. Если строка имеет какое-либо значение в ней вообще, она должна соответствовать выражению.

У меня есть другие шаблоны, которые соответствуют почтовым кодам США и т.д., которые нуждаются в одинаковых условиях.

Каков наилучший способ добиться этого в одном выражении?

Разъяснение. Я использую RegexValidator в блоке Application Validation из Microsoft. Примером использования этого является следующее:

[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); }
}

Вот почему мне нужно, чтобы решение находилось в одном выражении.

Ответы

Ответ 1

Оберните все регулярное выражение в parens и поместите a? в конце:

(\(?\d{3}\)?[-\s.]?\d{3}[-\s.]\d{4}/x)?

Ответ 2

Попробуйте добавить регулярное выражение (?:<your_regex>)?.

Ответ 3

Попробуйте следующее:

@"^(?:(\()?\d{3}(?(1)\)|[-\s.])\d{3}[-\s.]\d{4})?$"

Часть (?(1)\)|[-\s.]) - условная конструкция. В нем говорится: "Если было" ( "в начале (что мы знаем, потому что группа № 1 соответствует чему-то), сопоставьте" ) "здесь, в противном случае сопоставьте дефис, пробел или точку". И обертывание всего в (?:...)? позволяет ему соответствовать пустой строке, как сказал Кевин; если это не сработало для вас, вы, должно быть, потеряли один из парнеров (или, может быть, один из обратных косых черт).

Я добавил якоря ^ и $ для целей тестирования; в контроле проверки они не нужны.