带可选组的模式

时间:2015-02-13 09:27:46

标签: c# regex

我有一个有团体的模式。这些组都是可选的。

完整的可能模式是:

==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

不可能在小组中获得确定者,例如(A组不是' ='可能)。

所以我尝试了这些正则表达式:

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

问题:

  1. 如果缺少某个组,则不匹配
  2. 与'#' (E)包含第一组' - ' (F)
    • 001.002
    • PLC.003
    • M01.001
    • P1
    • test-KF2 - >错了,应该测​​试
    • KF3 - >错了,应该是KF2-KF3
  3. 我的错是什么?

1 个答案:

答案 0 :(得分:1)

我会通过构建每个阶段来解决这个问题,因此,您的“A”组以==开头,不能包含=,因此该部分可以与==[^=]+匹配,但是整个群组都是可选的,因此我将其用作(==[^=]+)?,将相同的主体应用于您的“B”群组,该群组以单个=开头,且不能包含+会给出一个(=[^+]+)?的可选组,在你所有的小组中工作最终会给出类似的东西:

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

我已假设任何给定组中不允许的字符,并且还假设每个组都是可选的(因此空字符串匹配),并且没有组需要先前的组(因此它对D有效)可以在没有C)的情况下出现 - 这些假设可以通过额外的分组或调整字符类来纠正,因此,例如,以下内容允许单独的F组(如果您正在分析数据,这可能很方便)

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