带组的简单java正则表达式
我想要一个带有三个组的正则表达式——A、B和C,用分号分隔。第三组不应是强制性的 我写了这样的东西:带组的简单java正则表达式,java,regex,Java,Regex,我想要一个带有三个组的正则表达式——A、B和C,用分号分隔。第三组不应是强制性的 我写了这样的东西: A=(.*);B=(.*);(C=(.*))? 它工作得很好,除了我总是在B后面加分号,即使并没有“C”部分。当我写作时: A=(.*);B=(.*)(;C=(.*))? 它不起作用了。在online regex tester上,我收到了这样的输出: 1 A=alfa;B=beta;C=gamma 0: [0,21] A=alfa;B=beta;C=gamma 1: [2,6] alfa
A=(.*);B=(.*);(C=(.*))?
它工作得很好,除了我总是在B后面加分号,即使并没有“C”部分。当我写作时:
A=(.*);B=(.*)(;C=(.*))?
它不起作用了。在online regex tester上,我收到了这样的输出:
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”的零件匹配第二组,而不是第三组。我怎样才能解决这个问题
^A=(\w+);?(?:B=(\w+))?;?(?:C=(\w+))?$
使用此选项。这将给出正确的组。请参阅演示
试试这个:
A=(.*);B=(.*)(?:$|;C=(.*))
说明:
- 使用
启动组会导致该组处于“非捕获”状态,这意味着该组以后不会被记住。这提高了性能,并使引用捕获的组时更容易理解(在本例中,您只需返回$1、$2和$3,而不是$1、$2和$4)?:
是字符串末尾的锚点$
告诉正则表达式匹配任意一方,因此这里它要么匹配字符串的结尾,要么匹配原始的C=模式|
^A=(\w+)(?:;B=(\w+)(?:;C=(\w+))?)?;?$
这可能有用
# "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
)?
)?
#“A=([^=;\\r\\n]*)?(?:(?最后我发现接受任何符号都有问题:(.*)
。我应该匹配任何不是分号的符号:([^;]+)
。最终的正则表达式如下:
^A=([^;]+);B=([^;]+)(;C=([^;]+))?$
试试。*?而不是。*-只是猜测一下,这就是为什么这是一条评论而不是一条评论answer@AmirAfghani这不是我要找的,请再次阅读我的问题。你在验证A(B(C)吗?这仍然要求在B=something
之后使用分号。OP写道:“我总是必须在B后面加分号,即使没有“C”部分。“并试图避免使用最后的分号。但我不想在这里包含分号。有效的输入是:“A=alpha;B=beta”或“A=alpha;B=beta;C=gamma”啊,我误解了。编辑了答案。@anubhava现在有了。嗯,现在它匹配了A=alfa;B=foo;C=bar-fff
。这个正则表达式匹配了A=,C=B-A=“B=betaChar%^ly;B=A=(C=]){}”因此,在a=alpha;B=beta;
之后不允许使用分号似乎很奇怪,有时灵活性需要与验证成比例。