RegExp - Как проверить обе скобки в строке

1

Я хотел бы знать, как я могу совместить текст ТОЛЬКО, если есть обе скобки (начало и закрытие).

В настоящее время мой RegExp: ^1?\s?\(?\d{3}\)?[-\s]?\d{3}[-\s]?\d{4}$.

Он проверяет действительные числа в США, однако \(? И \)? делает разницу. Он должен соответствовать тексту, если их 0 или 2.


Некоторые тесты:

1 555) 555-5555 - false

555) -555-5555 - false

(555-555-5555 - false

Теперь все они возвращают тот же результат - true.


Вот ссылка на него: https://regexr.com/3kjei (^ - это потому, что я должен выбрать только одну строку без разрыва строки, удалите из нее еще две строки, чтобы вы могли видеть, что она возвращает true. строки в этой ссылке должны возвращать true, просто проверьте, чтобы в текстовом редакторе была только одна строка).

Спасибо

  • 1
    Прямое решение было бы что-то вроде \(\d{3}\)|\d{3} .
  • 0
    Нет, нужно выбрать полную строку. Пожалуйста, не меняйте мой RegExp, все в порядке, мне нужно только проверить обе скобки.
Показать ещё 4 комментария
Теги:

2 ответа

1
Лучший ответ

Вы можете использовать

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

См. Демо-версию regex.

Заметим, что ^1?\s? в вашем регулярном выражении разрешить одно пробел в начале, поэтому я предлагаю ^(?:1\s?)? - необязательная последовательность, начинающаяся с 1 которая необязательно выполняется с пробелами.

\(?\d{3}\)? часть заменяется на (?:\(\d{3}\)|\d{3}) - не захватывающая группа, которая соответствует либо ( +3 digits+ ) либо 3 цифры (так, no (123 или 123) ').

подробности

  • ^ - начало строки
  • (?:1\s?)? - 1 или 0 вхождений 1 необязательно с 1 пробелом char
  • (?:\(\d{3}\)|\d{3}) - либо (, 3 цифры ) либо всего 3 цифры
  • [-\s]? - необязательный - или пробел
  • \d{3} - 3 цифры
  • [-\s]? - необязательный - или пробел
  • \d{4} - 4 цифры
  • $ - конец строки.
  • 0
    Что я могу сказать, вы действительно профессионал в этом деле :)
1

Почему не в части вашего регулярного выражения, которая говорит \(?\d{3}\)? что вы "или" это вместо этого. Например. Замените его примерно так:

((\(\d{3}\))|\d{3})

  • 0
    Это так же, как ответ @ Wiktor. И это имеет некоторые улучшения. Спасибо за потраченное время, но я приму его ответ :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню