当前位置: 首页 > 科技观察

Java正则表达式学习

时间:2023-03-14 00:25:56 科技观察

匹配模式JDK提供了三种匹配模式,分别是:贪婪模式(greedy)、勉强模式(reluctant)和占有模式(possessive),分别对应三种占有量词,其中贪婪模式为默认模式,不情愿的模式是通过添加一个?表达之后。所有格模式通过在表达式后附加一个+来表示。三种模式的含义是什么?贪心模式的意思是:尽可能匹配,同时也要尽量满足整体匹配。勉强模式的意思是:尽量少匹配,但也要尽量满足整体匹配。possessionmode的意思是:尽可能匹配,如果因为匹配太多导致无法匹配到collect,则不会回溯。例如有一个字符串如下:/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m/v/n表达式贪心模式匹配:/m/t.*/nl/n/p/m此时匹配结果为/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m勉强模式的表达式匹配:/m/t/.*?/nl/n/p/m此时匹配结果为/m/t/wd/nl/n/p/m/m/t/wdx+?/nl/n/p/m如果是这样的话,那么就不会匹配,因为+表示至少要匹配一个,勉强模式至少要匹配一个被匹配,所以匹配失败。占用模式的表达式匹配:/m/t.*+/nl/n/p/m此时无法匹配,因为.*匹配的字符太多,导致后面无法匹配。注意:变量匹配规则只能使用勉强或所有格量词。例如,X??意思是尽量少匹配字符X,而X?是默认的贪心模式,意思是尽可能匹配。又如:X{n}表示你必须准备匹配n个X,那么此时加入其他量词是行不通的Lookaround(预测)Lookaround是一个比较高级的题目,但是用起来很自然。Lookaround适用于这样的场景:在做正则匹配的时候,需要知道匹配的部分的前面或者后面,有没有,具体的表达,而不需要捕获(消费)这些具体的表达。如果不使用lookaround,而是直接使用表达式来判断,那么这些匹配到的表达式必然会被消耗掉。例如:假设我想打破ILoveYou这句话。原则是如果出现大写字母,就认为是新词。如果你使用这个匹配规则:\p{Upper}\p{Lower}*[\p{Upper}]?,那么匹配的大写字母将被消耗掉。匹配结果将是:ILYou这不符合要求。解决方法是使用lookaround,正则表达式为:\p{Upper}?\p{Lower}*(?=[\p{Upper}]?)输出结果为:ILoveYou有四种lookarounds:(?=X)表示后面是正则表达式X,在匹配前面的部分时,X的部分不会被消费,不会同时被捕获。零宽度正正预测。(?<=X)表示前面的部分是正则表达式X,匹配后面的部分时,X的部分不会被消耗,不会被捕获。零宽度负正预测。(?!X)表示后面不是正则表达式X,在匹配前面的部分时,X的部分不会被消耗,不会被捕获。零宽度正向负先行。(?!=X)表示前面的部分不是正则表达式X,匹配后面的部分时,X的部分不会被消费,同时也不会被捕获。零宽度反向负先行。非捕获占有匹配(?>X)这个没研究清楚。