Regex извлекает путь к классу из строки - PullRequest
1 голос
/ 06 ноября 2019

Я пытаюсь извлечь путь класса из строки. Формат строки может содержать разные пути к классам

(пример строки: DEBUG(tab)a.b.c.d.classname#, INFO(tab)a.classname#)

У меня есть регулярное выражение:

, если в пути несколько точек (?:\w\.\w\.[^#]*), который работает нормально, но когда я добавляю |(?:[^\d]\w\.\w{1,9999}[^#]*), если есть путь к классу, содержащий одну точку (второй пример выше), он также выбирает вкладку. В основном я хочу сделать регулярное выражение, которое соответствует любому пути класса. Как выбрать путь, если в пути к классу есть только одна точка?

пример полной строки:

2019-01-01 01:01:01.000+0000 [id=1](tab_here)INFO(tab_here)a.package.classname#sometext: somemoretext

, как выглядит регулярное выражение:

(?:\w\.\w\.[^#]*)|(?:[^\d]\w\.\w{1,9999}[^#]*)

ОБНОВЛЕНИЕ

желаемый результат - это совпадение пути к классу без tab, когда он содержит только один dot: результат, который у меня есть сtab ..

UPDATE # 2:

Все ответы великолепны, но мне пришлось модифицировать Vincents один, чтобы достичь того, что я хотел. Конечное регулярное выражение:

(\w+(?:\.\w+)+)(?=#)

, которое не нужно ни впереди, ни сзади. Результат совпадает с выводом Винсента.

Спасибо всем, кто участвовал!

Ответы [ 3 ]

0 голосов
/ 06 ноября 2019

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

Это предотвратит сопоставление, например .# или .#

Если вкладка не требуется, ее можно опустить.

\t(\w+(?:\.\w+)+)#
  • \t Соответствие вкладке
  • ( Захват группа 1
    • \w+ Совпадение с 1+ символами слова
    • (?:\.\w+)+ Совпадение с 1+ раз точкой и 1+ символами слова
  • ) Закрыть группу
  • # Совпадение буквально

Regex demo

0 голосов
/ 06 ноября 2019

Может быть, я что-то упустил, но я думаю, что это намного проще, чем то, что вы сделали.

Это работает для меня:

Замена .*?([\w\.]+)#.* на $1

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

Тестирование с использованием JavaScript в консоли Chrome:

console.log("INFO   a.package.classname#sometext".replace(/.*?([\w\.]+)#.*/,"$1"))
console.log("DEBUG(tab)a.b.c.d.classname#,sometext".replace(/.*?([\w\.]+)#.*/,"$1"))
console.log("INFO(tab)a.classname#,sometext".replace(/.*?([\w\.]+)#.*/,"$1"))

Вывод:

a.package.classname
a.b.c.d.classname
a.classname

.*?([\w\.]+)#.* означает любую последовательность букв и точек, которая заканчивается # (* .*? до и .* после позволяет сопоставлять все до и после этогошаблон, чтобы можно было удалить его)

0 голосов
/ 06 ноября 2019

Попробуйте решение следующим образом:

\t([\w\.]+?)#

Это относится к случаю, который вы упомянули. Однако это может потребовать определенных улучшений, чтобы охватить все возможные пути к классам "

enter image description here

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