В некоторой степени это будет зависеть от "аромата" RegEx, который вы используете.Следующее основано на .NET RegEx, который использует \b
для границ слов.В последнем примере он также использует отрицательный обход (?<!)
и (?!)
, а также не захватывающие скобки (?:)
В основном, если термины всегда содержат хотя бы одну заглавную букву, за которой следуетхотя бы одно число, вы можете использовать
\b[A-Z]+[0-9]+\b
для всех заглавных букв и цифр (всего должно быть 2 или более):
\b[A-Z0-9]{2,}\b
для всех заглавных букв и цифр, но начиная схотя бы одна буква:
\b[A-Z][A-Z0-9]+\b
Дедушка, чтобы вернуть элементы, которые имеют любую комбинацию прописных букв и цифр, но которые не являются одиночными буквами в начале строки и не являются частью строкивсе в верхнем регистре:
(?:(?<!^)[A-Z]\b|(?<!^[A-Z0-9 ]*)\b[A-Z0-9]+\b(?![A-Z0-9 ]$))
разбивка:
Регулярное выражение начинается с (?:
.?:
означает, что - хотя то, что следует в скобках, я не заинтересован в получении результата.Это называется "не захватывая скобки".Здесь я использую паретезы, потому что я использую чередование (см. Ниже).
Внутри необъявленных паренов у меня есть два отдельных предложения, разделенных символом трубы |
.Это чередование - как «или».Регулярное выражение может соответствовать первому выражению или второму.Здесь есть два случая: «это первое слово строки» или «все остальное», потому что у нас есть специальное требование исключения однобуквенных слов в начале строки.
Теперь давайте посмотримна каждое выражение в чередовании.
Первое выражение: (?<!^)[A-Z]\b
.Основным предложением здесь является [A-Z]\b
, то есть любая заглавная буква, за которой следует граница слова, которая может быть пунктуацией, пробелом, переводом строки и т. Д. Перед ней стоит (?<!^)
, что является «отрицательным взглядом сзади».Это утверждение нулевой ширины, которое означает, что оно не «потребляет» символы как часть совпадения - не очень важно понимать это здесь.Синтаксис отрицательного внешнего вида в .NET: (?<!x)
, где x - это выражение, которое должно , а не существовать до нашего основного предложения.Здесь это выражение просто ^
, или начало строки, поэтому эта сторона чередования переводится как «любое слово, состоящее из одной заглавной буквы, которая не в начале строки."
Хорошо, мы сопоставляем прописные слова из одной буквы, которые не находятся в начале строки.Нам все еще нужно сопоставить слова, состоящие из всех цифр и заглавных букв.
Это обрабатывается относительно небольшой частью второго выражения в чередовании: \b[A-Z0-9]+\b
.\b
s представляют границы слов, а [A-Z0-9]+
соответствует одному или нескольким цифрам и заглавным буквам вместе.
Остальная часть выражения состоит из других обходных путей.(?<!^[A-Z0-9 ]*)
- еще один негативный взгляд сзади, где выражение ^[A-Z0-9 ]*
.Это означает, что предшествующими должны быть не все заглавные буквы и цифры.
Второй обходной путь - (?![A-Z0-9 ]$)
, что является негативным прогнозом.Это означает, что последующее должно , а не быть всеми заглавными буквами и цифрами.
Итак, мы собираем слова всех заглавных букв и цифр и исключаем однобуквенные прописные буквы изначало строки и все, что в строках, которые все в верхнем регистре.
Здесь есть как минимум один недостаток в том, что обходные пути во втором выражении чередования действуют независимо, поэтому предложение типа «A P1 должно соединиться с J9"будет соответствовать J9, но не P1, потому что все до P1 пишется с заглавной буквы.
Эту проблему можно обойти, но это почти утроит длину регулярного выражения.Попытки сделать так много в одном регулярном выражении редко, если вообще когда-либо, справедливы.Вам лучше разбить работу на несколько регулярных выражений или на сочетание регулярных выражений и стандартных команд обработки строк на выбранном вами языке программирования.