匹配优先可能遇到的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/StriverLi/article/details/77967138

简单的问题

其实在精通正则表达式六:匹配优先与忽略优先中已经看到了匹配优先的问题,比如我想匹配一段文本中引号中的内容,用匹配优先就会出现问题:
这里写图片描述
原本希望匹配的是”Welcome”和”hosted”,然而却得到了错误的结果,上篇文章已经写过,这里就不多加赘述。

现在来说说如何解决这个问题,首先可以用忽略优先量词:
这里写图片描述

还可以用排除型字符组:
这里写图片描述
用排除法时注意,‘^’只要用在‘[]’的里面才是排除,且要放在第一个。但有时候使用排除型字符组也会遇到一些问题,因为在大多数流派中‘[^”]’可以匹配换行符:
这里写图片描述

如果不想让表达式匹配换行符,可以用‘[^”\n]’:
这里写图片描述
但是‘.’不会匹配换行符,所以用忽略优先量词是没问题的。

复杂点的问题

如果在匹配HTML的文本时要获取标签里的内容,比如

<B>Billions</B> and <B> Zillions</B> of ...

我需要匹配<B>和</B>之间的内容。
首先肯定不能用排除型字符组,因为这些标签肯定不是单个字符,而排除型字符组里面的每个字符之间是或关系。这时可以用忽略优先量词:
这里写图片描述
注意‘<\/B>’中的‘\’是转义用的。
但忽略优先量词有时候也会出问题,比如现在要匹配这个:

<B>Billions and <B> Zillions</B> of ...

这里写图片描述
所以忽略优先量词并不能完美替代排除类,上面的例子也会出现这个问题:
这里写图片描述
回到现在的例子,现在即不能用忽略优先量词,有不能用排除型字符组,该如何解决这一类问题呢?用否定环视!
这里写图片描述
这时候不管是用匹配优先量词还是忽略优先量词都可以。

猜你喜欢

转载自blog.csdn.net/StriverLi/article/details/77967138