基本上我想要一个匹配这个条件的正则表达式
我目前有这个正则表达式:
^(?i:([a-z]{1,8})(\d+)((?!or|and).)+)$
这适用于以下示例:
但不是这个,因为我认为如果满足" OR"在" FORALL":
预期产出:
AAAAAAAA100NANDROID - should match
AAAAAAAA100ANDROID - should not match
AAAAAAAA100OR - should not match
AAAAAAAA100AND - should not match
基本上我不希望FOR匹配OR,我的问题的任何解决方案?顺便说一句,这是Ruby
答案 0 :(得分:1)
答案 1 :(得分:1)
我认为你正在寻找这个(我正在使用一个积极的后视(?<=\d)
,因此我们只排除前面有数字的or
或and
:
^(?i:([a-z]{1,8})(\d+)((?!(?<=\d)(?:or|and)).)+)$
请参阅demo
答案 2 :(得分:1)
^(?i:[a-z]{8}\d+(?!or|and).*)$
答案 3 :(得分:1)
@anubhava正则表达式和其他人喜欢的问题是,
在断言后使用.*
过于自由了。
这意味着它可以在断言之前拆分表达式然后转换 在另一边拿起它。
例如,^(?i:([a-z]{8})(\d+)((?!or|and).*))$
可以轻松匹配AAAAAAAA100AND
这是一种罕见的情况,会导致引擎回溯一个数字,以满足断言
通常,如果没有使用.*
,则无需担心。
这可以通过在断言中注入\d*
构造来修复
请注意,断言是独立的,它们首先匹配,然后检查它是否应该失败。但是,如果可以的话,这并不能阻止引擎回溯。
^(?i:([a-z]{8})(\d+)((?!\d*(?:or|and)).*))$
扩展:
^
(?i:
( [a-z]{8} ) # (1)
( \d+ ) # (2)
( # (3 start)
(?!
\d*
(?: or | and )
)
.*
) # (3 end)
)
$