Совпадение слов с пробелами после нескольких префиксов - PullRequest
0 голосов
/ 30 октября 2011

У меня есть следующая строка

D_Doc Name L_Linked Doc Q_1_5

или

D_Doc Name L_Linked Doc Q_5

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

Doc Name
Linked Doc
1_5 or 5

Имя D_Doc всегда присутствует L_ и Q_ не

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

D_Doc Name Doc Q_1_5
D_Doc Name Doc Q_5
D_Doc Name L_Linked Doc

Я хотел бы иметь возможность ссылаться на совпадения как на совпадение ['DocName']или какое-то значение полностью, так что я знаю, какое совпадение найдено, а какое нет.

Есть предложения?

Ответы [ 3 ]

1 голос
/ 30 октября 2011

Если я вас правильно понимаю, то регулярное выражение, которое вы хотите, выглядит примерно так:

^D_(?<D>.*?)( L_(?<L>.*?))?( Q_(?<Q>.*))?$

Для некоторых входных данных теста выдает следующие результаты:

Input                          D             L           Q 
D_Doc Name L_Linked Doc Q_1_5  Doc Name      Linked Doc  1_5
D_Doc Name Doc Q_1_5           Doc Name Doc              1_5
D_Doc Name Doc Q_5             Doc Name Doc              5
D_Doc Name L_Linked Doc        Doc Name      Linked Doc
D_Doc Name Doc Q_5             Doc Name Doc              5
0 голосов
/ 30 октября 2011

Ваши требования немного сложны для расшифровки, но я думаю, что это сделает это:

D_(\w+) (\w+) (L_(\w+) )?(\w+)( (Q_)?(\w+))?

и если вы хотите добавить "Именованные группы" (с тем, что я предполагаюсоответствующие имена):

D_(?<Doc>\w+) (?<DocName>\w+) (L_(?<Linked>\w+) )?(?<LinkedDoc>\w+)( (Q_)?(?<Q>\S+))?

0 голосов
/ 30 октября 2011

Может быть, регулярное выражение слишком много для этой проблемы, я бы использовал простую строку. Split (s, ''), а затем я буду анализировать слова одно за другим, возможно, с regex для последнего слова.Кроме того, последнее слово легко разделяется.Я думаю, было бы проще написать свой код, просто работая с массивом.

...