Совпадение с любым символом (включая пробелы), пока ПОСЛЕДНЯЯ куча пробелов - PullRequest
1 голос
/ 10 ноября 2019

У меня есть такой текст:

0000       10   [STUFF]  Text ("TOTAL,SOME RANDOM  TEXT")     (558b6a68)

Первые два столбца довольно статичны. Третий не является обязательным. Последнее является необязательным, и если оно существует, то оно всегда заключено в круглые скобки.

Моя проблема связана с четвертым столбцом, в котором могут быть пробелы или фактически любой символ (кроме, конечно, символа новой строки).

Мое текущее регулярное выражение выглядит следующим образом:

^([a-fA-F0-9]{4,})\s+[a-fA-F0-9]+\s+(?:\[[^\]]*\]\s+)?

Это соответствует всем до начала четвертого столбца.

Обратите внимание, что место может существовать где угодно, я могу '• определить точное местоположение, например, «всегда перед круглыми скобками» или «может быть между кавычками».

Я точно знаю, что это столбец перед последним. Поэтому я хотел бы захватить их так:

 0000       10   [STUFF]  Text("TOTAL,SOME RANDOM  TEXT")      (558b6a68)
 ^  ^                     ^                             ^      ^        ^
CAPTURE                   C    A    P    T    U    R    E     C A P T U R E

Я хотел бы захватить тексты, отмеченные между символами ^ ^, упомянутыми в предыдущем блоке кода.

Итак, я 'Я хотел бы захватить любого персонажа, пока не появятся последние пробелы, но я также не хочу включать их в группу финального матча.

Надеюсь, я хорошо это описал :) Это вообще возможно с помощью регулярных выражений?

Вот еще пример текста для проверки:

0000       10        Text("TOTAL,SOME RANDOM  TEXT")  (1122aabb)
0010        5        D==1122aabb     (1122aabb)
0015       17        Text("AND,SOME,MORE")  (00000001)
002c        5        D==1            (1)
0031        1        !D              (ccdd3344)
0032        5        D==ccdd3344     (ccdd3344)
0037        2        !1              (1)
0039        0 [AAAA] Fff
0039        1 [BBBB] Aaa
003a        6        N(05, eeff5566)  (eeff5566)
0040        1        Qq
0041        2        $ab             ([String]:"Unknown")
0043        f        Call A/SomeFunc-X
0052        1        cd

1 Ответ

3 голосов
/ 10 ноября 2019

Я бы также начал, как ваш шаблон, с чего-то вроде ^(\w+) +\w+ +(?:\[[^\]]+\] *)?

Отсюда (начало 4-го столбца) запишите первый \S непустой пробел, за которым следует .*? лениво любое количество символов, пока не будет захвачена необязательная часть в скобках на конце $. Если нет, то полная строка занята второй группой.

^(\w+) +\w+ +(?:\[[^\]]+\] *)?(\S.*?)(?: +(\([^)]+\)))?$

См. Эту демонстрацию в regex101

Не стесняйтесь корректировать скобки третьей группы захватывать только то, что внутри , если необходимо.

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