Ответ 1
Оберните все регулярное выражение в parens и поместите a? в конце:
(\(?\d{3}\)?[-\s.]?\d{3}[-\s.]\d{4}/x)?
Мне нужно регулярное выражение, которое соответствует шаблону или пустое.
Сейчас у меня есть выражение...
"\(?\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); }
}
Вот почему мне нужно, чтобы решение находилось в одном выражении.
Оберните все регулярное выражение в parens и поместите a? в конце:
(\(?\d{3}\)?[-\s.]?\d{3}[-\s.]\d{4}/x)?
Попробуйте добавить регулярное выражение (?:<your_regex>)?
.
Попробуйте следующее:
@"^(?:(\()?\d{3}(?(1)\)|[-\s.])\d{3}[-\s.]\d{4})?$"
Часть (?(1)\)|[-\s.])
- условная конструкция. В нем говорится: "Если было" ( "в начале (что мы знаем, потому что группа № 1 соответствует чему-то), сопоставьте" ) "здесь, в противном случае сопоставьте дефис, пробел или точку". И обертывание всего в (?:...)?
позволяет ему соответствовать пустой строке, как сказал Кевин; если это не сработало для вас, вы, должно быть, потеряли один из парнеров (или, может быть, один из обратных косых черт).
Я добавил якоря ^
и $
для целей тестирования; в контроле проверки они не нужны.