[英]Regex to match certain conditions
基本上我想要一個正則表達式來滿足這個條件
我目前有這個正則表達式:
^(?i:([a-z]{1,8})(\d+)((?!or|and).)+)$
對於下面的示例,這可以正常工作:
但不適合這一點,因為我認為如果在“ FORALL”中滿足“ OR”:
預期產量:
AAAAAAAA100NANDROID - should match
AAAAAAAA100ANDROID - should not match
AAAAAAAA100OR - should not match
AAAAAAAA100AND - should not match
基本上我不希望FOR匹配OR,對我的問題有解決方案嗎? 順便說一句,這是給Ruby的
我認為您正在尋找這個(我正在使用正向后看(?<=\\d)
以便我們僅排除or
或and
以數字開頭):
^(?i:([a-z]{1,8})(\d+)((?!(?<=\d)(?:or|and)).)+)$
觀看演示
anubhava的答案似乎與正確的值匹配,但以前的所有答案似乎都包含一個或多個捕獲組,我在您的原始帖子中並未看到要求。 這是另一種可能的解決方案,它將匹配沒有組的整個字符串:
^(?i:[a-z]{8}\d+(?!or|and).*)$
@anubhava正則表達式和其他類似的問題是
在斷言之后使用.*
太寬松了。
這意味着它可以在斷言之前拆分表達式,然后
在另一邊撿起來。
例如^(?i:([az]{8})(\\d+)((?!or|and).*))$
很容易匹配AAAAAAAA100AND
這是一種罕見的情況,導致引擎后退一個數字,以滿足斷言。
通常,如果不使用.*
,則無需擔心。
可以通過在斷言中注入\\d*
構造來解決此問題。
請注意,斷言是獨立的,它們將首先匹配,然后檢查它是否應該失敗。 但這並不能阻止引擎回溯。
^(?i:([az]{8})(\\d+)((?!\\d*(?:or|and)).*))$
擴展:
^
(?i:
( [a-z]{8} ) # (1)
( \d+ ) # (2)
( # (3 start)
(?!
\d*
(?: or | and )
)
.*
) # (3 end)
)
$
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.