正则表达式操作的优先级
我写了一些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|
我需要解释一下在处理这种情况时regex引擎是如何工作的。
正则表达式的工作原理:状态机始终从左到右读取。 ,|,,
== ,|,,
因为它始终只与第一次交替匹配:
img http://sofzh.miximages.com/java/9fb73ec138449ed2489d7b66f703447d.png
,,|,
== ,,?
:
x http://sofzh.miximages.com/java/f39e53c2fd99e9832b2c04508a988c9f.png
但是,你应该使用,,?
相反,所以没有回溯:
r http://sofzh.miximages.com/java/d06516c7d2cdf5dd4c1e65886dbaf281.png
看到这两个结果,似乎split方法首先尝试找到第一个表达式(“,”表示regex2,“,,”表示regex1)并拆分字符串,然后是第二个表达式,但是在第一次传递之后regex2字符串中没有单个“,”。 这就是为什么当用regex2读取“,,”时检测到空字符串。
因此,为了使正则表达式有用,您需要首先编写更复杂的表达式。
它将从左到右进行评估。 在regex1
,首先尝试\\,\\,
,否则尝试使用\\,
。 这就是为什么第12个String不为空,因为在这种情况下匹配\\,\\,
。 对于regex2
,所有内容都使用\\,
匹配,因此是空字符串。
案例1:拆分,,
否则,
这只得到第一种情况,其余部分由。
案例2:拆分,
否则,,
得到所有案件。 所以,,
分成word
和,word
。
然后,word
被分成“”和word
。