2015-10-29 3 views
1

Я пытаюсь применить регулярное выражение на некотором некорректном тексте. Общий формат:группы захвата regex в некорректном тексте

descriptor (one|two|three|four) code

Идеальный вход Пример:

hello world (one) 0039x

И я хочу, чтобы захватить 3 группы:

"hello world", "one", "0039x"

(замечаешь отсутствующего скобка в группа (2))

Искаженные примеры:

hello (world) (two) 0039x 
hello (world) three 0039x 
hello world, four 0039x 
hello (world)*,four 0039x 

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

Вот что я придумал:

([a-z0-9 \*\(\)]*),?\s?\(?(one|two|three|four)\)?\s([a-z0-9]+)

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

"hello world (", "one", "0039x"

Что лучше регулярное выражение, которое будет работать с нормальным случаем и также деформированные случаи? Вероятно, это полезно, но я не уверен, как использовать (?:...) и фиксировать любую скобку, если она также входит в состав descriptor.

ответ

0

Предполагая, что вы хотите, чтобы соответствовать до запятой или пробелом непосредственно перед (one|two|three|four) вы можете использовать это регулярное выражение:

^(.+?)[\s,]\(?(one|two|three|four)\)?\s([a-z0-9]+)$ 

RegEx Demo

0

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

([a-z0-9 \*\(\)]*),?\s?\((one|two|three|four)\)\s([a-z0-9]+) 
Смежные вопросы