RegEx:围绕文本匹配格式;

时间:2014-11-26 17:06:17

标签: php regex

我在项目中有一个实例,我需要在描述或标题中匹配一些文本;

匹配要求如下;

应匹配:

a)出现任何"卷" OR" Part" (Case Insensitive);

b)任何" vol"或" pt" (CI)在[之后]和[期间]之前没有[[逗号] [空格];

我在regex101上尝试了许多不同的正则表达式模式(从4开始倒计时):http://regex101.com/r/lO9vO9/4

在那个链接中,有几行失败,我希望,理想情况下匹配。

. pt.因为它包含带有尾随句点的pt,但在预期逗号时有错误的字符(句点)

The Red Pill, Pt 2因为它包含前面的逗号和PT,但是错过了PT之后的句号。

如果有人可以帮助我,我会很感激,如果它的工作原理也可用 - 所以我可以弄清楚我哪里出错了。

2 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式:

(,\s(?:vol|pt)\.(*SKIP)(*F)|\b(?:volume|pt|vol|part)\b)

RegEx Demo

此部分,\s(?:vol|pt)\.只匹配您的否定模式,(*SKIP)(*F)只是从最终匹配中跳过它。

More info on (*SKIP) and (*FAIL)

答案 1 :(得分:1)

所以,换句话说,你想禁止,pt& vol后面没有一个点,而pt& vol之前没有逗号和空格:

volume|part|(?<!, )(?:vol|pt)|(?:vol|pt)(?!\.)

demo

注意:您可以通过在开头处添加前瞻和单词边界来改进此模式(以这种方式,仅针对以p和v开头的单词测试交替)。您也可以查看&#34; vol&#34;或&#34; pt&#34;通过强迫没有字母跟随,这不是另一个词的开头。

(?=\b[pv])(?:volume|part|(?<!, )(?:vol|pt)|(?:vol|pt)(?!\.))(?![a-z])