修复正则表达式以解决ICU / RegexKitLite错误

时间:2011-02-12 22:09:59

标签: regex icu

我正在使用RegexKitLite,后者又使用ICU作为引擎。尽管有文档,但在搜索“xxxxxxxxxxx”时,像/ x * /这样的正则表达式将匹配空字符串。它的行为类似于/ x *?/ should。我想在它出现时绕过这个bug,我正在考虑在正则表达式匹配返回0长度结果时将任何未转义的*重写为+。我天真的猜测是,带有+ s的正则表达式将始终返回正确结果的子集。这有什么意想不到的后果?我走对了路吗?

FWIW,ICU也提供* +运算符,但它也不起作用。

编辑:我应该更清楚:这是针对交互式应用的搜索字段。我无法控制用户输入的正则表达式。破碎的*支持似乎是ICU中的一个错误。我当然希望我不需要在我的代码中包含该POS,但它是城里唯一的游戏。

4 个答案:

答案 0 :(得分:1)

如果您只是将每个*量词更改为+,那么正则表达式将无法在* 匹配零次的情况下起作用。换句话说,问题将从始终匹配零变为从不匹配零。如果你问我,这两种方式都没用。

但是,您可以单独处理零事件情况,使用负向前瞻。例如,x*可以重写为(?:(?!x)|x+)。我知道这很可怕,但这是我目前可以设想的最独立的解决方案。你也必须为占有星(*+)而不是不情愿的星(*?)这样做。

这是表格形式:

BEFORE       AFTER
x*           (?:(?!x)|x+)
x*+          (?:(?!x)|x++)
x*?          x*?
更复杂的原子需要保留自己的括号:
(?:xyz)*     (?:(?!(?:xyz))|(?:xyz)+)
你可能会将它们放在前瞻中,但它们除了可读性之外不会伤害任何东西,无论如何这都是一个失败的原因。 :D如果{min,}{min,max}形式也受到影响,它们将得到相同的处理(对占有变体进行相同的修改):

x{0,}        same as x*
x{0,n}       (?:(?!x)|x{1,n})

我觉得条件 - (?(condition)yes-pattern|no-pattern) - 在这里是完美的契合;不幸的是,ICU似乎并不支持他们。

答案 1 :(得分:1)

我不能说有问题的代码出了什么问题,但我可以放心地说这个特定的错误不在ICU库中。 (我是ICU正则表达式包的作者。)

我同意上面表达的观点,要做的事情不是试图通过调整正则表达式模式来解决问题,而是要了解底层问题是什么。可能存在一些简单的错误,从原始问题中看不清楚。

答案 2 :(得分:0)

\*[*]都是文字星号,因此天真的替代品可能不起作用。

事实上,不要做动态重写,这太复杂了。首先尝试静态调整你的正则表达式。

x*相当于x{0,}(?:x+)?

答案 3 :(得分:0)

是的,使用那个策略:
(伪代码)

if($ str =〜/ x * /&& $ str =〜/(x +)/){    打印“'$ 1'\ n”; }

但真正的问题是你说的BUG。为什么地球上量词的基本结构被搞砸了?这不是您应该在代码中包含的模块。