2017-06-04 31 views
-2

我的目的是查找一個函數,用於檢查字符串是否以小寫字母開頭,以小寫字母結尾,可能只包含一個或沒有連字符-,並且小於或等於32個字符。javascript正則表達式在某些規則下匹配字符串?

以下是我的代碼:

var ss = /^[a-z]+([A-Za-z0-9_]|(-?)|[a-z]+$){1,31}/; 
 
str="ss-fjdkkldjkskjdskjdksjdkjdkjklskssdkdkffdkdfkdfk"; 
 
ss.test(str);

測試字符串 結果與真實 aJDS-A a234bds aHJH878sjkJSK-JA

我的函數目前返回true並沒有按」不符合我的要求。 如果測試字符串符合註冊要求,結果應該返回true。 我不知道爲什麼。

+1

您發佈的測試字符串以小寫字母開頭,以小寫字母結尾,中間有一個。你爲什麼期望返回錯誤? – Paul

+1

爲什麼它應該返回false?它符合條件 – hjpotter92

+0

,因爲它不符合要求 –

回答

1

請注意,JS正則表達式中的[A-Za-z0-9_]等於\w。因此,這裏有幾種解決方案,您的問題:

  • 整個字符串的長度被檢查或者與代碼(str.length > 0 && str.length <= 32)或使用(?=.{1,32}$)正向前查找後^啓動的串錨在下面
  • 正則表達式的建議
  • 如果您需要時,它包含了一個-某處裏面只匹配字符串,請使用一個可選的非捕獲組這樣的 - ^[a-z]\w*(?:-\w*[a-z])?$(=>^(?=.{1,31}$)[a-z]\w*(?:-\w*[a-z])?$
  • 如果連字符是可選的,加?量詞後: ^[a-z]\w*(?:-?\w*[a-z])?$(=>^(?=.{1,31}$)[a-z]\w*(?:-?\w*[a-z])?$
  • 如果你只需要匹配一個字符串,當它包含任何數量的-裏面的某個地方,請使用^[a-z](?:[-\w]*[a-z])?$(=>^(?=.{1,31}$)[a-z](?:[-\w]*[a-z])?$)。