簡體   English   中英

有沒有更好的方法來寫正則表達式,該正則表達式在前導和尾隨空格以及字符限制上不匹配?

[英]Is there a better way to write a regex that does not match on leading and trailing spaces along with a character limit?

我有的正則表達式是...

^[A-z0-9]*[A-z0-9\s]{0,20}[A-z0-9]*$

此正則表達式的最終目標是不允許前導和尾隨空格,同時將輸入的字符限制為20個,而上述正則表達式不能很好地做到這一點。

我發現了一些與此類似的問題,而與此最接近的問題是如何使用正則表達式驗證用戶名? ,但沒有限制字符數。 這確實解決了前導和尾隨空格的問題。

我還看到了使用否定和另一種否定性超前的方法,但這對我來說效果不佳。

有沒有更好的方法來編寫20個字符以下的正則表達式? 允許的字符重復非常難看,尤其是當允許的字符列表很大且特定時。

嗯,如果您需要排除單個字符的文本,我可以選擇:

^[A-z0-9][A-z0-9\s]{0,18}[A-z0-9]$

如果單個字符也可以接受:

^[A-z0-9](?:[A-z0-9\s]{0,18}[A-z0-9])?$

更新:

我更喜歡這個。 我們使用負數前瞻,以確保在字符串末尾沒有^\\s (字符串開頭的空白)或\\s$空格。 然后匹配1個字母數字字符。 我們將其重復1-20次。

/^(?:(?!^\s|\s$)[a-z0-9\s]){1,20}$/i

演示版

^            (?# beginning of string)
(?:          (?# non-capture group for repetition)
  (?!        (?# begin negative lookahead)
    ^\s      (?# whitespace at beginning of string)
   |         (?# OR)
    \s$      (?# whitespace at end of string)
  )          (?# end negative lookahead)
  [a-z0-9\s] (?# match one alphanumeric/whitespace character)
){1,20}      (?# repeat this process 1-20 times)
$            (?# end of string)

初始:

我在字符串的開頭( (?!...) )使用否定的前瞻,以確保我們不以空格開頭。 然后,我們檢查0-19個字母數字字符(由於使用i修飾符而不區分大小寫)或空格字符。 最后,由於我們不能在Javascript中使用lookbehinds,因此請確保以純字母數字字符(無空格)結尾。

/^(?!\s)[a-z0-9\s]{0,19}[a-z0-9]$/i
  • 我認為您的正則表達式將輸入限制為22個字符,而不是20個字符。
  • 您是否知道字符范圍[Az]包含字符[\\]^_`
  • 我想我會做這樣的事情:

     input = input.trim().replace(/\\s+/, ' '); if (input.length > MAX_INPUT_LENGTH || ! /^[az ]+$/i.match(input) ) { # raise exception? } 

\\S匹配非空格字符。 因此,這應該與您要查找的內容匹配:

^\\S.{0,18}\\S$

也就是說,一個非空格字符\\S ,后跟最多18個任何類型的字符. (是否為空格),最后是非空格字符。

上述正則表達式的唯一限制是該值必須至少為2個字符。 如果需要允許1個字符,則可以使用:

^\\S(.{0,18}\\S)?$

如果您要驗證用戶名(暗示但未明確說明),則可能只允許數字,字母和下划線。 在這種情況下, ^\\w{1,20}$就足夠了。

使用此模式^(?!\\s).{0,20}(?<!\\s)$

  • ^(?!\\s)行首沒有看到空格
  • .{0,20}后跟0至20個字符
  • (?<!\\s)$以非空格字符結尾

演示版

還是這種模式^(\\S.{0,18}\\S)?$
演示版

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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