Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带组的简单java正则表达式_Java_Regex - Fatal编程技术网

带组的简单java正则表达式

带组的简单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,用分号分隔。第三组不应是强制性的

我写了这样的东西:

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;
之后不允许使用分号似乎很奇怪,有时灵活性需要与验证成比例。