正则表达式中的负回顾后断言表现为正常的回顾后断言或者会出现错误。

6
我正在尝试使用负向回顾(negative lookbehind)的正则表达式来捕获一些数据,以便在某个特定字符串之前不匹配。我知道有两种基本格式,但都不起作用。 我在搜索应用程序中执行此操作,无法使用Java进行修改,因此解决方案必须纯粹使用正则表达式
这种格式会导致错误,显示“正则表达式语法错误:无效的限定符”: (?<!Product) Type : (.*?)< 这种格式会像普通的回顾预测(lookbehind)一样工作,并且只有在Type之前有Product时才捕获: (?!=Product) Type : (.*?)< 我做错了什么?

1
"(?<!)" 绝对是在 "java.util.regex" 中用于负向后查找的正确语法,但您确定您的搜索应用程序正在使用 "java.util.regex" 而不是其他正则表达式实现,例如 ORO 吗?" - Ian Roberts
嗯,我没有考虑过那个。我已经使用它有一段时间了,应用程序本身是用Java编写的,直到现在为止一直按照预期运行。ORO不允许负回顾吗? - Travis Crum
(?!=Product) 不是一个向后查找,而是对字面字符串=Product的负向向前查找。它不可能按照你所说的方式工作。你需要阅读**这篇文章**,因为你对于向前查找有一些错误的想法。 - Alan Moore
@AlanMoore,我想混淆可能只是你所说的正则表达式没有负向后看。或者可能与@IanRoberts的评论有关,他认为java.util.regex有它,但大多数其他人没有。如果你明白我的意思,我很想知道你对这个问题的想法。 - Travis Crum
1
我认为@Ian是正确的,你的应用程序正在使用ORO,或者可能是Jakarta Regexp,它也不支持lookbehinds。但是,我所知道的每种支持它们的风格都使用(?<=...)表示正向lookbehind,而使用(?<!...)表示负向lookbehind。 - Alan Moore
显示剩余5条评论
1个回答

3
(?<!Product)[ ]Type[ ]:[ ](.*?)<

这应该能满足您的需求。您需要用方括号[]将空格包起来。
它不会匹配: 产品类型:xyz< 但它会匹配并捕获xyz其他类型:xyz<

但是解释总是会很好的! - Travis Crum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接