Соответствие отдельному слову, не содержащему точку - PullRequest
0 голосов
/ 07 ноября 2019

Взяв строку примерно так:

Line 1: Test  TableA
Line 2:    TableA  AWord
Line 3: TableA AWord
Line 4: This.TableA
Line 5: This. TableA Aword

Я хочу соответствовать при соблюдении следующих критериев:

  1. Слово Таблица A найдено
  2. В той же строке, где находится таблица A, нет ни одной точки.
  3. Может быть любое количество пробелов или других символов перед словом TableA
  4. Могут быть символы. после слова TableA

Таким образом, в приведенном выше сценарии:

  • Строки 1,2 и 3 должны совпадать - но ТОЛЬКО для слова TableA
  • Строки 4 и 5 НЕ должны совпадать с

У меня возникли серьезные проблемы с тем, чтобы это сработало.

-

Это соответствует каждой строке, кроме # 3- и соответствует от начала строки до конца таблицы A

^([^\.].*)(?:TableA)

-

Это соответствует строке 1,2,3 & 5 и для 1 &2 он соответствует от начала строки до конца таблицы A

(?!\.).(\s)*(TableA)(?=\s|$)

-

Это соответствует 1,2,3 (ближе всего кбуровая установкаht answer), но соответствует от начала строки до конца таблицыA

^(?!.*\.).*(TableA)

Этот поток: Регулярное выражение: Соответствие слову, не содержащему Содержит решение, котороеделает очень похожую вещь на то, что мне удалось вывести, но опять же, он соответствует каждому символу перед найденным конкретным словом.

Это в PowerShell - так что я считаю, что PCRE эффективно использует то, что использует (?)

1 Ответ

2 голосов
/ 07 ноября 2019

вы можете исключить символы новой строки, а также отрицательный класс символов, не совпадающий с точкой. [^.] также будет соответствовать символу новой строки.

Чтобы сопоставить слово TableA, вы можете использовать обходные выражения (?<!\S) и (?!\S) дляне указывайте без пробельных символов вокруг него для предотвращения сопоставления $TableA$

Значение находится в первой группе захвата.

^[^\r\n.]*(?<!\S)(TableA)(?!\S)[^\r\n.]*$

По частям

  • ^ Начало строки
  • [^\r\n.]* Соответствие 0+ раз не . или символ новой строки
  • (?<!\S)TableA(?!\S) Таблица соответствия A, не окруженная символами без пробелов
  • [^\r\n.]* Совпадение 0+ раз не . или перевод строки
  • $ Конец строки

Regex demo

Если выЕсли вы хотите использовать PCRE, вы можете использовать \K и положительный прогноз:

^[^\r\n.]*\K(?<!\S)\KTableA(?!\S)(?=[^\r\n.]*$)

Regex demo

...