我希望有三个组的正则表达式--A,B和C,用分号分隔。第三组不应该是强制性的。
我写了类似的东西:A=(.*);B=(.*);(C=(.*))?
它工作正常,除了我总是必须在B之后加分号,即使没有" C"部分。当我写:
A=(.*);B=(.*)(;C=(.*))?
它无法正常工作。在线正则表达式测试仪我收到了这样的输出:
1 A=alfa;B=beta;C=gamma
0: [0,21] A=alfa;B=beta;C=gamma
1: [2,6] alfa
2: [9,21] beta;C=gamma
3: [-1,-1] null
4: [-1,-1] null
2 A=alfa;B=beta;
0: [0,14] A=alfa;B=beta;
1: [2,6] alfa
2: [9,14] beta;
3: [-1,-1] null
4: [-1,-1] null
3 A=alfa;B=beta
0: [0,13] A=alfa;B=beta
1: [2,6] alfa
2: [9,13] beta
3: [-1,-1] null
4: [-1,-1] null
正如你在第一个例子中所看到的,部分是" C = gamma"匹配第二组,而不是第三组。我该如何解决这个问题?
答案 0 :(得分:0)
答案 1 :(得分:0)
请改为尝试:
A=(.*);B=(.*)(?:$|;C=(.*))
<强>解释强>
?:
启动群组会使其成为&#34;非捕获&#34;这意味着这个小组以后不会被记住。这样可以提高性能,并且在引用捕获的组时更容易理解(在这种情况下,您只需返回1美元,2美元和3美元而不是1美元,2美元和4美元)。$
是字符串末尾的锚点。|
告诉正则表达式匹配任何一方,因此它将匹配字符串的结尾或原始的C =模式。答案 2 :(得分:0)
答案 3 :(得分:0)
这可能有用。
# "A=([^=;\\r\\n]*);?(?:(?<=;)B=([^=;\\r\\n]*);?(?:(?<=;)C=([^=;\\r\\n]*);?)?)?"
A = # Required A
( [^=;\r\n]* ) # (1), A Non-delimiter values
;? # Optional semi-colon
(?:
(?<= ; ) # Must be semi-colon separator behind
B = # Optional B
( [^=;\r\n]* ) # (2), B Non-delimiter values
;? # Optional semi-colon
(?:
(?<= ; ) # Must be semi-colon separator behind
C = # Optional C
( [^=;\r\n]* ) # (3), C Non-delimiter values
;? # Optional semi-colon
)?
)?
答案 4 :(得分:0)
最后我发现,问题在于接受任何标志:(.*)
。我应该匹配任何不是分号的内容:([^;]+)
。最终正则表达式如下:
^A=([^;]+);B=([^;]+)(;C=([^;]+))?$