我正在使用RegexKitLite,后者又使用ICU作为引擎。尽管有文档,但在搜索“xxxxxxxxxxx”时,像/ x * /这样的正则表达式将匹配空字符串。它的行为类似于/ x *?/ should。我想在它出现时绕过这个bug,我正在考虑在正则表达式匹配返回0长度结果时将任何未转义的*重写为+。我天真的猜测是,带有+ s的正则表达式将始终返回正确结果的子集。这有什么意想不到的后果?我走对了路吗?
FWIW,ICU也提供* +运算符,但它也不起作用。
编辑:我应该更清楚:这是针对交互式应用的搜索字段。我无法控制用户输入的正则表达式。破碎的*支持似乎是ICU中的一个错误。我当然希望我不需要在我的代码中包含该POS,但它是城里唯一的游戏。
答案 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。为什么地球上量词的基本结构被搞砸了?这不是您应该在代码中包含的模块。