【发布时间】:2018-02-07 14:30:46
【问题描述】:
看起来我好像在拖钓,但这是我拥有的正则表达式:
(?=([+]{0,1}(mem|[01N]+)([+\/\-*%]([01N]+|mem))+|[-](mem|[01N]+)([+\-*%]([01N]+|mem))*)|(=[+-]{0,1}(mem|[01N]+)([+\-*%]([01N]+|mem))*)|(bt[+-]{0,1}(mem|[0-9]+)([+\/\-*%]([0-9]+|mem))*)|(dec[+-]{0,1}(mem|[01N]+)([+\-*%]([01N]+|mem))*)|([+]?mem)|(quit))|(?<=([+]{0,1}(mem|[01N]+)([+\/\-*%]([01N]+|mem))+|[-](mem|[01N]+)([+\-*%]([01N]+|mem))*)|(=[+-]{0,1}(mem|[01N]+)([+\-*%]([01N]+|mem))*)|(bt[+-]{0,1}(mem|[0-9]+)([+\/\-*%]([0-9]+|mem))*)|(dec[+-]{0,1}(mem|[01N]+)([+\-*%]([01N]+|mem))*)|([+]?mem)|(quit))
它基本上分为两部分:第一部分将在正向 Lookahead 处拆分,第二部分在正向 Lookbehind 处拆分。第一部分工作正常,但 Lookbehind 部分给出引擎错误。
用于测试的站点:https://regex101.com/
你能帮忙吗?
【问题讨论】:
-
如果你想在 Java 中使用正则表达式,你应该在那里测试它。您发布的网站似乎只支持其他可能或多或少有细微差别的正则表达式引擎。 Java 发出以下错误:
Look-behind group does not have an obvious maximum length。 - 这已经提供了一些提示:lookbehind 可能太大,所以 Java 引擎会抱怨。如果您知道最大长度,您可以尝试以{0,max}的形式提供它,其中max是您期望的匹配的最大长度。 -
检查“匹配信息”面板;它会告诉你“lookbehind assertion is not fixed length - offset: 340”,这确实是大多数正则表达式引擎的问题。
-
切换到 regex101 中的 javascript 引擎以避免这个问题(不过我很惊讶,我想我记得 javascript 也不允许可变宽度的后视)。当然,真正的问题是您的目标环境使用什么正则表达式引擎以及正则表达式是否可以在那里工作,并且由于 Java 不支持可变宽度正则表达式,您将不得不重写您的正则表达式
-
顺便说一句,你的表达看起来很复杂,很难阅读和理解。您可能想考虑是否真的需要正则表达式(其他方式可能更容易和更快)或者是否可以简化正则表达式。例如,您真的需要环视吗?或者更简单的匹配“在 A(而不是向后看)和 B(而不是向前看)之间”就足够了吗?
-
伙计,请查看此资源 - regex101.com