2017-02-27 381 views
1

我有以下正則表達式/[a-zA-Z0-9_-]/,並且當字符串只包含從az較低的字符時,我需要返回false和大寫字母,數字和_-正則表達式/ [a-zA-Z0-9 _-] /當通過`!!!`時返回true

  • 我的代碼有什麼問題?
  • 您能否給我提供一個簡單的解釋和一個關於如何解決它的代碼示例?

//var str = 'EKyirtVHsK0'; ok 
 
var str = '!%!irtVHsK0'; // should return false 
 
var result = /[a-zA-Z0-9_-]/.test(str); 
 
alert(result);

+0

你要逃避'-'字符類 – hindmost

+3

@hindmost內:只有在一個位置,它可以形成一個範圍內使用。也就是說,不是在字符類的開始/結束處,而是在有效範圍之後。 –

+0

你說過,當字符串只包含數字,a-z,'_'和'-'時,你應該得到'false'。你的例子中的字符串也包含其他字符,所以它應該像返回true一樣。它不應該返回'false'。 –

回答

7

你的字符串包含與您的正則表達式查找部分匹配匹配的符號。事實上,如果你使用str.match(/[a-zA-Z0-9_-]/),你會看到你匹配i

添加錨和量詞:

/^[a-zA-Z0-9_-]*$/ 
^    ^^ 

或者,如果1+字符在輸入要求:

/^[a-zA-Z0-9_-]+$/ 
      ^
-1

var str = 'EKyirtVHsK0'; // ok 
 
var str2 = '!%!irtVHsK0'; // should return false 
 
var result = /^[a-z0-9_-]+$/i.test(str); 
 
var result2 = /^[a-z0-9_-]+$/i.test(str2); 
 
alert(result); 
 
alert(result2);

如前所述通過Wiktor的Stribizew ,你正在與你的正則表達式進行部分匹配。在這種特殊情況下,它意味着字符串將逐字符遍歷,直到找到匹配或達到字符串的末尾。用你的字符串它將在索引3(我)匹配,並返回true。由於^與字符串的開始匹配,並且$與末尾匹配,所以在開始時使用^並在表達式末尾使用$,您強制它完全匹配整個字符串的內容。

/^[a-zA-Z0-9_-]$/匹配由從a到z,A到Z,0到9,連字符或下劃線中的任何單個字符組成的字符串,因此它會匹配'3','b','E',' - '或'_'而不是'ab'或'er',因爲在這種情況下,^$將字符串限制爲只有一個字符。

要測試由特定數量的這些字符組成的字符串,必須引入一個星號(如果字符串可以爲空)或加號(如果它必須至少包含一個字符)。所以/^[a-zA-Z0-9_-]+$/只有在字符串完全由表達式中的字符範圍組成時才返回true。

您也可以不設使用i標誌,它告訴表達式不區分大小寫的比賽,留給你/^[a-z0-9_-]+$/i作爲最終表達A-Z部分。

2

如果一個字符其他比指定的人發現你可以檢查並返回true如果這樣做:

console.log(isValid("!%!irtVHsK0")); 
 
console.log(isValid("char09_-")); 
 

 
function isValid(str) { 
 
    return str.match(/[^a-zA-Z0-9_-]/) !== null; 
 
}

[...]匹配特定的字符。
[^...]排除特定的字符。

在這種情況下,匹配/[^a-zA-Z0-9_-]/一個字符不是a-zA-Z0-9_-

match()方法將返回指定的模式或所有的第一次出現,如果啓用了全局標誌。如果沒有找到,則返回null

str.match(/[^a-zA-Z0-9_-]/g); // "g" enables the global flag 

請注意,^帽子符號具有時,它不是方括號像[^...]內不同的含義。如果在外面,則表示字符串的開始。

我會建議您訪問this page學習正則表達式,它很容易。你也可以使用this來測試你的正則表達式。

5

你的代碼沒有問題。只有你的期望是有點關閉。

RegExp.test()說明文檔中提到:

使用test(),每當你想知道的模式是否在字符串中找到(類似於String.prototype.search()方法[...])

test()方法不會驗證您的整個字符串是否與正則表達式匹配,但只有匹配它的子字符串。

在其當前形式中,您的代碼檢查如果字符串包含從所述範圍內的至少一個字符(字母,數字,或減短劃線)。

如果您需要檢查匹配對整個字符串,你應該使用boundaries(也許一quantifier):

/^[a-zA-Z0-9_-]+$/ 
  • ^字符串的開頭匹配;
  • $匹配字符串的結尾;
  • +表示之前的表達式匹配一次或多次;以前的表達式是[...]範圍。

此更新後的表達式與僅包含字母,數字,破折號和小數且不爲空的字符串匹配;使用*而不是+以允許空字符串; *使以前的表達式匹配零次或多次。


更新:

一個更好的辦法是把^爲範圍的第一個字符並解釋由test()周圍的其他方法的返回值。 ^否定範圍塊的含義([...])。 [^a-zA-Z0-9_-]匹配任何不是字母,數字,短劃線或逗號的字符。

我需要返回false當字符串只包含字符從az較低和大寫字母,數字和_-

的正則表達式/[^a-zA-Z0-9_-]/是有效的滿足您的需求(它至少包含一個字符不能是字母,數字,破折號或逗號)匹配的字符串。

var re = /[^a-zA-Z0-9_-]/ 
alert('Valid: ' + re.test('EKyirtVHsK0'));    // false 
alert('Valid: ' + re.test('!%!irtVHsK0'));    // true