Сопоставление слов с пробелами после нескольких префиксов

#c# #regex #preg-match

#c# #регулярное выражение #preg-совпадение

Вопрос:

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

 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’] или какое-то значение полностью, чтобы я знал, какое совпадение найдено, а какое нет.

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

Комментарии:

1. Каким именно должен быть результат из всех этих случаев?

2. Я бы хотел, чтобы результаты сопоставления имели от 1 до 3 значений. В основном все после префикса и перед следующим (имя документа, связанный документ, 1_5 или 5)

3. Как насчет этого? D_Doc Name Doc Q_5 Здесь вы получите имя документа Doc, 5

4. Это было бы хорошо, если бы я мог назвать совпадения и проверить, какие из них есть.

Ответ №1:

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

 ^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
  

Ответ №2:

Возможно, регулярных выражений слишком много для этой проблемы, я бы использовал простую строку.Разделите (s, ‘ ‘), а затем я буду анализировать слова одно за другим, возможно, с регулярным выражением для последнего слова. Однако также последнее слово легко разбивается. Я думаю, было бы проще написать свой код, просто работая с массивом.

Комментарии:

1. Это то, о чем я думал и уже начал, но просто хотел посмотреть, насколько мощным является регулярное выражение или возможно ли это вообще / быстрее.

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

3. Поскольку ваш код полон if, я бы предложил просто массив 🙂

Ответ №3:

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

D_(w ) (w ) (L_(w ) )?(w )( (Q_)?(w ))?

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

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