【发布时间】:2018-07-15 15:41:39
【问题描述】:
我在 pcre 中尝试这条正则表达式行时遇到了一个奇怪的错误:
^(.*[ \-_])?(SS|SSN|SIN|SSIN|SSNSIN|((SOC(IAL)?[_\- ]?SEC(URITY)?|SOC)[_\-
]?(DISABILITY)?[_\- ]?(INSURANCE)?(NUMBER|NUM|NO|NBR|NR)?))([ \-_].*)?(?<!
(CD|DT|F))$
错误信息是: 您的表达导致了未处理的错误: 后视断言不是固定长度 - 偏移量:158
我试图用这个来修复它,但它不起作用:
^(.*[ \-_])?(SS|SSN|SIN|SSIN|SSNSIN|((SOC(IAL)?[_\- ]?SEC(URITY)?|SOC)[_\-
]?(DISABILITY)?[_\- ]?(INSURANCE)?(NUMBER|NUM|NO|NBR|NR)?))([ \-_].*)?(?:(?
<!(CD|DT))|(?<!F))$
请帮忙!
【问题讨论】:
-
我遵循了stackoverflow.com/questions/3796436/… 中的解决方案,但没有奏效。我猜他们的情况是 ?
-
这不是一个奇怪的错误,它在错误消息中正确地说明了这一点。您的后视需要 固定 长度(而不是可变长度)。这意味着您的后视
(?<!(CD|DT|F))需要是 1 个或 2 个字符,但不能同时是两者。目前,(?<!(CD|DT|F))的长度为 2 (CD,DT) 或 长度为 1 (F)。您不能在 PCRE 中执行此操作。此规则的唯一例外是当您使用 0 长度断言时,例如^、$等。 -
感谢您的评论。我知道这个错误的原因,但只是不知道如何解决它。它必须在 pcre 中完成。你有什么解决办法吗?
-
@XinJin 你能给我们提供几个示例字符串吗?这样做可以让我们提供正确的方法,但您可能需要使用带有 if 子句的
(*FAIL)之类的控制动词 -
@XinJin:你只需要删除捕获组:
(?<!(CD|DT|F))=>(?<!CD|DT|F)