正则表达式操作的优先级

时间:2014-08-07 09:51:15

标签: java regex regex-greedy regex-alternation

我编写了一些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|

在处理这种情况时,我需要解释正则表达式引擎的工作原理。

4 个答案:

答案 0 :(得分:4)

正则表达式的工作原理:状态机始终从左向右读取。 ,|,, == ,,因为它始终只与第一次更改相匹配:

img http://gyazo.com/9fb73ec138449ed2489d7b66f703447d.png

,,|, == ,,?

x http://gyazo.com/f39e53c2fd99e9832b2c04508a988c9f.png


但是,您应该使用,,?代替,因此没有回溯:

r http://gyazo.com/d06516c7d2cdf5dd4c1e65886dbaf281.png

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

案例1:按,,其他,分割 这只是第一种情况,其余部分由,分割。

案例2:按,其他,,分割         获得所有案件。因此,,分为word,word         然后,word分为" "和word