簡體   English   中英

正則表達式以匹配某些條件

[英]Regex to match certain conditions

基本上我想要一個正則表達式來滿足這個條件

  1. 前8個字符應在[a-zA-Z]之內
  2. 后跟任意數量的數字
  3. 后跟任何單詞字符,但不立即跟在“或”或“與”之后

我目前有這個正則表達式:

^(?i:([a-z]{1,8})(\d+)((?!or|and).)+)$

對於下面的示例,這可以正常工作:

  • ABCDEFGH
  • GFEDCBAH

但不適合這一點,因為我認為如果在“ FORALL”中滿足“ OR”:

  • WOLRDWAR

預期產量:

AAAAAAAA100NANDROID - should match
AAAAAAAA100ANDROID - should not match
AAAAAAAA100OR - should not match
AAAAAAAA100AND - should not match

基本上我不希望FOR匹配OR,對我的問題有解決方案嗎? 順便說一句,這是給Ruby的

您可以將正則表達式調整為:

/^(?i:([a-z]{8})(\d+)((?!or|and).*))$/

正則演示

我認為您正在尋找這個(我正在使用正向后看(?<=\\d)以便我們僅排除orand以數字開頭):

^(?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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM