简单的java正则表达式与组

时间:2014-09-16 16:45:13

标签: java regex

我希望有三个组的正则表达式--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"匹配第二组,而不是第三组。我该如何解决这个问题?

5 个答案:

答案 0 :(得分:0)

^A=(\w+);?(?:B=(\w+))?;?(?:C=(\w+))?$

使用此。这将给出正确的组。参见演示。

http://regex101.com/r/hJ7nT4/7

答案 1 :(得分:0)

请改为尝试:

A=(.*);B=(.*)(?:$|;C=(.*))

<强>解释

  • 使用?:启动群组会使其成为&#34;非捕获&#34;这意味着这个小组以后不会被记住。这样可以提高性能,并且在引用捕获的组时更容易理解(在这种情况下,您只需返回1美元,2美元和3美元而不是1美元,2美元和4美元)。
  • $是字符串末尾的锚点。
  • |告诉正则表达式匹配任何一方,因此它将匹配字符串的结尾或原始的C =模式。

答案 2 :(得分:0)

这个正则表达式适合你:

^A=(\w+)(?:;B=(\w+)(?:;C=(\w+))?)?;?$

RegEx Demo

答案 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=([^;]+))?$