2013-02-19 63 views
1

就在你認爲你已經掌握了正則表達式時;這一切都取消了。希望如果發現除字母數字和空白字符之外的任何內容,則返回錯誤檢查。帶空白的正則表達式的字母數字

function checkName(fname) 
{ 
    var rexp = new RegExp(/[^a-zA-Z0-9]\s/gim) 
    if (!rexp.test(fname)) 
    { 
     alert ("'" + fname + "'\nis okay") 
    } 
    else 
    { 
     alert ("'" + fname + "'\nis NOT okay") 
    } 
    return !rexp.test(fname) 
} 

我希望上面的代碼將返回以下

  • 「這是確定」 - 真正的
  • 「這,是不是OK」 -false
  • 「也不是這好!「 -false
  • 「也不是\」 這行」 - 假
+0

請使用* RegExp構造函數*或* regex文字,但不能同時使用*。 – Bergi 2013-02-19 13:13:51

回答

2

雖然許多討論的是對的,一切似乎缺少您反轉字符類的點,然後反轉導致你的功能。這在邏輯上難以閱讀。你也可以對正則表達式進行兩次測試,沒有任何理由。乾淨多了會是這樣的:

function checkName(fname) { 
    var result = /^[a-z0-9\s]+$/i.test(fname) 

    if (result) { 
     alert ("'" + fname + "'\nis okay") 
    } else { 
     alert ("'" + fname + "'\nis NOT okay") 
    } 
    return result; 
} 

更新:它看起來像傑克的編輯拍攝過這些問題。 (總是晚一分鐘,鎳短...)

1

有幾件事情:

  1. /something/new RegExp('something')短的符號;你不應該混淆了

  2. 您需要將\s移動到字符類中;否則,您將匹配不是字母數字的字符後跟一個空格。

  3. 我不認爲你需要所有這些修飾語:

    1. /m,如果你在你的表達錨是唯一有用的,
    2. /i可以,如果你從字符類中刪除A-Za-z使用,
    3. /g僅適用於需要多次匹配的情況,但在您的情況下,第一次匹配就足夠了。

      var rexp = /[^a-zA-Z0-9\s]/; 
      

全功能可以這樣寫:

function checkName(fname) 
{ 
    return !/[^a-zA-Z0-9\s]/.test(fname); 
} 

而不是使用雙重否定的,倒不如說 「只允許這些字符」:

function checkName(fname) 
{ 
    return /^[a-zA-Z0-9\s]*$/.test(fname); 
} 

如果您還需要測試非空名稱,那麼您應該使用/^[a-zA-Z0-9\s]+$/

+0

@downvoter認真嗎?這個答案有什麼問題? – 2013-02-19 13:24:43

+1

我不是downvoter,但我經過這些編輯後更喜歡這個答案! – 2013-02-19 13:40:56

1
[^a-zA-Z0-9]\s 

您的正則表達式要求空格在字母/數字後面。

要修復它,請將括號內的\s移開。

雖然你仍然需要做更多的事情。正則表達式只會匹配這些字符中的一個。添加+以匹配一個或多個。

因此,固定的正則表達式:

[^a-zA-Z0-9\s]+ 
+0

該表達意思相反,即如果「錯誤」集合中至少有一個字符,則拒絕該值。不知道你的答案會做什麼,但我認爲它是不正確的:) – 2013-02-19 13:23:55

+0

@Jack OP說「除了字母數字和空白字符」 – Doorknob 2013-02-19 13:24:58

+0

是的,「以外」意味着沒有字符不是字母數字:)我同意雙重否定不是很好,但即使如此,你的表達也應該被固定......這樣做會使它與Will.i.am的答案一樣:) – 2013-02-19 13:27:07

0

嘗試:

function checkName(fname) 
{ 
    var rexp = new RegExp(/^[a-z0-9\s]+$/i) 
    if (!rexp.test(fname)) 
    { 
     alert ("'" + fname + "'\nis okay") 
    } 
    else 
    { 
     alert ("'" + fname + "'\nis NOT okay") 
    } 
    return !rexp.test(fname) 
} 
+0

你可能應該解釋說,你逆轉了表達,然後錨定它;在這種情況下,你需要反轉'if'條件。 – 2013-02-19 13:18:43

相關問題