日期:2014-05-20  浏览次数:20718 次

正则表达式的贪婪匹配问题。
我现在想在文本中抓取这样的一些内容 以一个标点开始,以另外一个标点结束,中间包含了'\d名'这样的字段的一个语段。


正则表达式这么定义的
public static final String REGEX="(?is)([,.,。:]([^,.,。:]*\\d名[^,.,。:]*)[,.,。:])";


匹配以下内容
“招聘计划招聘计划为5名。其中:咨询服务员3名(限男性),解说员1名(限女性),文秘1名。”

得到的结果是

“一、招聘计划招聘计划为5名
咨询服务员3名(限男性)
文秘1名”


“,解说员1名(限女性),”这一部分没有匹配到,可能是因为逗号被前后的表达式分别用过了,我想知道怎么让他把这一句也匹配出来,即是竟可能多的匹配。


------解决方案--------------------
[,.,。:]([^,.,。:]*\\d名[^,.,。:]*)(?=[,.,。:])
用预查找的试试看呢,原来的
public static final String REGEX="(?is)([,.,。:]([^,.,。:]*\\d名[^,.,。:]*)[,.,。:])";匹配时候一直要到后面的那个标点,然后下一轮将从这个标点之后继续的。比如
用[a-z](\\d+)[a-z]匹配a123b456c789d000e第一轮得123的时候就把a123b用了,下一轮从b后面开始,就会漏掉本来符合的b456c。后面同理了。用预查找的就不消耗字符[a-z](\\d+)(?=[a-z])