如何匹配/或与正则表达式匹配

时间:2016-04-15 09:56:37

标签: regex

我为正则表达式问题道歉但是......

我正在开发一个用于抓取职称的正则表达式。

职务名称将始终采用以下格式:

职位名称:Word1 Word2(可选Word3)

我目前有这个:

Job Title: ([A-Z\w]+ [A-Z\w]+)|Job Title: ([A-Z\w]+ [A-Z\w]+ [A-Z\w]+)

我试图让它与两个或三个单词的职位相匹配,管道角色的每一面都单独工作(左侧匹配2个字的职称,右侧匹配3个字的职称),但是当我添加管道字符时,它只适用于左半部分,匹配2个字的职称。

有没有人知道我做错了什么?

注意:我使用Regexper来表达我的表情,看起来是正确的。

干杯。

2 个答案:

答案 0 :(得分:1)

原因是左侧部分可以匹配正确的替代方案可以匹配的相同子字符串(在相同位置),并且模式未锚定。您需要锚定它,或交换备选方案。或使用可选组。这是一个增强版本:

Job Title: ([A-Z]\w* [A-Z]\w*(?: [A-Z]\w*)?)
                             ^^^^^^^^^^^^^^

请参阅regex demo

如果您不在乎初始字母是小写还是大写,请添加/i不区分大小写的修饰符(或相应的标记(如re.IRegexOptions.IgnoreCase等) 。)取决于正则表达式的风味):

/Job Title: ([A-Z]\w* [A-Z]\w*(?: [A-Z]\w*)?)/i

由于[A-Z\w]+\w匹配A-Z毫无意义,我建议使用[A-Z]\w* - 大写的ASCII字母后跟零个或多个字母数字/下划线字符。

非捕获组(?: [A-Z]\w*)是可选的(此部分可能在输入中丢失),因为它使用?量词来量化,这意味着一次或零次

答案 1 :(得分:0)

怎么样:

Job Title: ((?: *[A-Z]\w+){2,3})

在行动here

中查看

这样,如果接受的单词数量在某些时候发生了变化,那么您无需进行太多改动以适应解决方案。

如果您不想与人们输入超过3个字的情况相匹配,您可以在最后添加$:例如this