Шаблон регулярной информации - PullRequest
1 голос
/ 26 января 2012

Я в первые несколько дней обучения регулярным выражениям.Я пытаюсь выполнить простое сопоставление с шаблоном, чтобы найти вхождения в моем файле журнала маркеров @@@ XXX @@@, где XXX - это заглавное слово, в котором не допускаются пробелы / числовые значения (также допускается подчеркивание).Между начальным &&& и фактическим словом или словом и завершающим &&& не должно быть пробелов или их может быть несколько.XXX всегда в верхнем регистре, в нем нельзя использовать пробелы / числовые значения (подчеркивание разрешено).

Некоторые допустимые примеры: @@@ CAT @@@

@@@ CAT @@@

@@@ CAT @@@

@@@ CAT_DOG @@@

Я пытался сделать что-то вроде:

Pattern pattern = Pattern.compile("\\@{3}(\\s* \\w \\s*)\\@{3}");

Не так лисредняя проверка для 3 экземпляров @, за которыми следуют o до n экземпляров пробела, за которыми следует слово, за которым снова следует o до n экземпляров пробела, за которыми следуют 3 экземпляра @?Он фиксирует случаи с @@, но не фиксирует, когда используется более 3 @.Как мне указать, что есть 3 и только 3 экземпляра @?.... И, очевидно, я до сих пор не включил ограничение в верхнем регистре.

Ответы [ 3 ]

1 голос
/ 26 января 2012

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

(?:[^@]|^)@{3}(\s*[A-Z_]+\s*)@{3}(?!@)

// or with Java escaping

(?:[^@]|^)@{3}(\\s*[A-Z_]+\\s*)@{3}(?!@)

Помещение буквального пробела создает необходимый пробел.Так что a b отличается от ab.В исходном шаблоне у вас было пространство между \\s+ \w.Также \w соответствует строчным и прописным буквам.Использование класса символов приведет к совпадению только в верхнем регистре.


Если вы хотите избежать более трех (как предполагает один из комментариев), вам нужно добавить немного дополнительного кода.

В начале мы помещаем это, которое говорит, что соответствует либо не-символ, либо начало строки ^.(?:) означает, что мы не заботимся об этой части матча.

(?:[^@]|^)

В конце мы должны сказать, что следующий символ не может быть @.(?!) означает сбой, если шаблон может соответствовать.Это не в конечном итоге захватывает его, потому что это нулевая ширина прогноз.

(?!@)

Я обновил шаблоны в верхней части.

Эти новые шаблоныбудет не соответствовать этим.

@@@ CAT_DOG @@@@

@@@@ CAT_DOG @@@

1 голос
/ 26 января 2012

Вот что вы должны сделать.

[^@]?@{3}\s*([A-Z_]*)\s*@{3}[^@]
  1. [^ @]? необязательно соответствует любому отдельному символу, кроме @ (для исключения соответствия @@@@)

  2. @{3} соответствует в точности 3 @ символов

  3. \s* соответствует нулевым или более символам пробела

  4. [A-Z _] * соответствует буквам ZERO или MORE в верхнем регистре или _ символов). (), заключающий в себе выражение , захватывает содержимое группы , поэтому вы можно легко извлечь содержимое .

  5. \s* соответствует нулевым или более символам пробела

  6. @{3} соответствует 3 @ символов

  7. [^ @] соответствует любому отдельному символу, кроме @ (для исключения соответствия @@@@)

Вот страница интерактивных регулярных выражений ( с вашим проработанным примером ), которую я все время использую для решения таких вещей.

0 голосов
/ 26 января 2012

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

"(^|[^@])@{3}\s*[_A-Z]+\s*@{3}($|[^@])"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...