Захват двух групп из строки с помощью регулярного выражения - PullRequest
1 голос
/ 09 декабря 2011

Я ничего не знаю о регулярных выражениях, и сейчас у меня нет времени их изучать.

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

test (22/22/22)

Мне нужно захватить test и дату 22/22/22 в массиве.

тестовая строка также может быть строкой из нескольких слов:

test test(1) tes-t (22/22/22)

должен захватить test test(1) tes-t и 22/22/22

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

(\(.*)

но это действительно никуда меня не приведет.

Может ли кто-нибудь помочь мне здесь и объяснить, как мне это сделать? Я немного потерян.

Спасибо

Ответы [ 3 ]

1 голос
/ 09 декабря 2011

Чтобы объяснить данное регулярное выражение: (. *) \ (([^)] +) \)

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

\ ( - это экранированная скобка. Это то, что вы напишите, когда захотите захватить скобку.

[^)] + означает что-либо, кроме скобок (специальные символы не должны быть в квадратных скобках) один или несколько раз.

([^)] +) отражает то, что объяснено выше

\) соответствует закрывающей скобке

Таким образом, это регулярное выражение завершится ошибкой и захватит неправильные строки, если у вас есть, скажем, скобки в ваших первых словах, например:

тестовый тест (1) tes-t (22/22/22)

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

1 голос
/ 09 декабря 2011

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

^(.*)\(([^)]*)\)

Смотрите здесь онлайн на Regexr

При наведении указателя мыши на спички синего цвета вы можете увидеть содержимое групп захвата.

Объяснение

^ BeginOfLine

(.*) CapturingGroup 1 AnyCharacterExcept \ n, ноль или более раз

\(([^)]*)\) (CapturingGroup 2, AnyCharNotIn [)] ноль или более раз

0 голосов
/ 09 декабря 2011

Эта стрелка работает на вашем примере ввода:

(.*)\(([^)]+)\)
...