2015-02-13 2 views
0

У меня есть шаблон, который имеет группы. Эти группы являются необязательными.Шаблон с необязательными группами

Полная Возможная картина:

==A=B++C+D#E-F-F-F-F-F-F-F-F-F-F 

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

==A=B++C+D#E-F-F-F-F-F-F-F-F-F-F 
==A.A++C.C+D.D-F 
=B++C-F 
++C+F-F-F 

Это не представляется возможным получить Определитель в группе, такие как (группа А не «=» возможное).

Так я попробовал эти регулярные выражения:

(.*)?\=\=(.*)?\=(.*)?\+\+(.*)?\+(.*)?\#(.*)?\-(.*) 

Проблема:

  1. Если группа отсутствует, не соответствует
  2. группы с '#' (E) содержит первую группу ' -»(F)
    • 001,002
    • PLC.003
    • M01.001
    • P1
    • тест-KF2 -> неправильно, должен быть тест
    • KF3 -> неправильно, должно быть KF2-KF3

Что моя вина ?

+1

Я немного непонятно, на что именно вы нуждаясь, но я могу видеть, что из ваших четыре В примерах только один из них имеет три '=' в нем, и в вашем регулярном выражении есть три необязательных '=', поэтому только первый может совпадать. – Chris

+0

Группа1 имеет префикс '==', а Group2 имеет префикс '=', оба необязательные ... почему они не являются необязательными? – Suplanus

+0

Вы поместили знак вопроса после группы - это означает, что сама группа не является обязательной, а «=» - нет. – nXu

ответ

1

Я бы подойти к этому путем создания каждой стадии, поэтому, ваша группа «А» начинается с == и не может содержать =, так что участок может быть сопоставлен по ==[^=]+, но вся группа не является обязательным, так что я бы использовать его в качестве (==[^=]+)?, применяя тот же принцип к вашей группе «B», которая начинается с одного = и не может содержать + бы дать дополнительную группу (=[^+]+)?, работая вдоль всех групп, наконец, дать что-то вроде:

(==[^=]+)?(=([^+]+))?(\+\+([^+]+))?(\+([^#]+))?(#([^-]))?(\-(.*))? 

Я сделал предположения относительно символов, которые недопустимы в любом заданном g roup, а также предполагается, что каждая группа является необязательной (так что пустая строка соответствует), и ни одна группа не требует предыдущей группы (так что это действительно так, что D может появиться без C) - эти предположения могут корректироваться с дополнительной группировкой или корректировать классы символов , так что, например, следующее позволяет отдельные группы F (что может быть удобно, если вы разбираете данные)

(==[^=]+)?(=([^+]+))?(\+\+([^+]+))?(\+([^#]+))?(#([^-]))?(\-([^-]))* 
+0

Спасибо.Его еще рядом, но второй шаблон дает их обратно для первого значения (я не нужно значение группы без префикса): == = В В C++ С + D D #E E -FFFFFFFFFF FFFFFFFFFF – Suplanus

+0

Что вы подразумеваете под «возвращает их для первого значения»? –

+0

Это результат регулярного выражения (значения группы). – Suplanus

Смежные вопросы