【问题标题】:Priority in regex manipulating正则表达式操作的优先级
【发布时间】:2014-09-30 12:12:54
【问题描述】:

我编写了一些 java 代码来将字符串拆分为字符串数组。首先,我使用正则表达式模式"\\,\\,|\\," 分割该字符串,然后使用模式"\\,|\\,\\," 分割该字符串。为什么第一个输出和第二个输出有区别?

public class Test2 {
    public static void main(String[] args){

        String regex1 = "\\,\\,|\\,";
        String regex2 = "\\,|\\,\\,"; 

        String a  = "20140608,FT141590Z0LL,0608103611018634TCKJ3301000000018667,3000054789,IDR1742630000001,80507,1000,6012,TCKJ3301,6.00E+12,ID0010015,WADORI PURWANTO,,3000054789";
        String ss[] = a.split(regex1); 

        int index = 0; 
        for(String m : ss){
            System.out.println((index++)+ ": "+m+"|"); 
        }
    }
} 

使用regex1时的输出:

0: 20140608|
1: FT141590Z0LL|
2: 0608103611018634TCKJ3301000000018667|
3: 3000054789|
4: IDR1742630000001|
5: 80507|
6: 1000|
7: 6012|
8: TCKJ3301|
9: 6.00E+12|
10: ID0010015|
11: WADORI PURWANTO|
12: 3000054789|

而当使用regex2:

0: 20140608|
1: FT141590Z0LL|
2: 0608103611018634TCKJ3301000000018667|
3: 3000054789|
4: IDR1742630000001|
5: 80507|
6: 1000|
7: 6012|
8: TCKJ3301|
9: 6.00E+12|
10: ID0010015|
11: WADORI PURWANTO|
12: |
13: 3000054789|

我需要解释一下正则表达式引擎在处理这种情况时是如何工作的。

【问题讨论】:

  • 你不必引用,
  • @MarounMaroun 你能根据我的问题给出具体答案吗...
  • MarounMaroun comment 并非旨在成为答案,而只是一些可以提高您问题的可读性的附加信息。简而言之:当你可以简单地写",,|,"时,你不需要写"\\,\\,|\\,"

标签: java regex regex-greedy regex-alternation


【解决方案1】:

正则表达式的工作原理:状态机总是从左到右读取。 ,|,, == ,,因为它总是只匹配第一个替换:


(来源:gyazo.com

,,|, == ,,?:


(来源:gyazo.com


但是,您应该改用,,?,这样就不会回溯:


(来源:gyazo.com

【讨论】:

    【解决方案2】:

    案例 1:由 ,, 拆分,否则为 ,
    这只是第一种情况,其余的由, 分割。

    案例 2:由 , 拆分,否则为 ,,
    获取所有案例。所以,, 被分成word,word
    然后,word 被拆分为 " " 和 word

    【讨论】:

      【解决方案3】:

      它将从左到右进行评估。在regex1 中,首先尝试\\,\\,,否则尝试\\,。这就是第 12 个字符串不为空的原因,因为在这种情况下匹配了 \\,\\,。对于regex2,所有内容都使用\\, 匹配,因此为空字符串。

      【讨论】:

        【解决方案4】:

        看到这两个结果,似乎 split 方法首先尝试找到第一个表达式(“,”对于 regex2,“,,”对于 regex1)并拆分字符串,然后是第二个,但在第一次使用 regex2 时,字符串中没有一个“,”。 这就是为什么用 regex2 读取 ",," 时会检测到空字符串的原因。

        因此,要使您的正则表达式有用,您需要先编写更复杂的表达式。

        【讨论】:

          猜你喜欢
          • 2016-08-20
          • 1970-01-01
          • 1970-01-01
          • 2013-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-01
          • 2011-10-22
          相关资源
          最近更新 更多