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

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

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

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

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

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

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

Пояснение : Я использую RegexValidator в блоке приложения проверки от 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); }
}

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

Ответы [ 3 ]

30 голосов
/ 25 марта 2009

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

(\(?\d{3}\)?[-\s.]?\d{3}[-\s.]\d{4}/x)?
2 голосов
/ 25 марта 2009

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

1 голос
/ 25 марта 2009

Попробуйте это:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...