2015-05-18 63 views
0

我正在檢查多行文本框中任何非字母數字字符的字符串的第一個字符。如果我通過這個字符串,我會得到一些命中。JavaScript正則表達式給出誤報

ATest 
BTest2 
CAnother1 
DThen some 
2 More to go 
FAny other some-day 

這裏的javascript代碼:

function CheckFirstAlphaNum(textToTest, valueLabel, pattern, warningMessage)  
{ 
    var textValues = textToTest.split("\n"); 
    pattern = pattern || /([A-Za-z0-9]+)/gm; 
    warningMessage = warningMessage || "The first character of a value in '" + valueLabel + "' has an invalid character. Please consider revising it." 

    var goodText = true; 
    for (var i = 0; i < textValues.length; ++i) { 
     //alert(textValues[i]); 
     var firstChar = textValues[i].substring(0, 1); 
     if (!pattern.test(firstChar)) { 
      alert(firstChar); 
      alert(pattern); 
      goodText = false; 
     } 
    } 
    if (goodText != true) { alert(warningMessage); } 
    return goodText; 
} 

任何想法,爲什麼?它在B,D和F上失敗,所以它看起來像其他任何一行。

+0

它可能是相關的行結尾。有些系統使用'\ r \ n'結尾,如果你只是在'\ n'上分割,你的字符串中可能會有一些麻煩的空白。試試這個'var firstChar = textValues [i] .trim()。substring(0,1);' – dan08

回答

1

可能是因爲你的正則表達式不正確。

我不知道什麼/gm交換機在做到底,但嘗試:

/^[A-Za-z0-9]/ 

從原來的正則表達式,一對夫婦點要注意的事項:

  1. ^匹配字符串的開頭
  2. +如果您只關心單個字符
0

您的文本最有可能具有Windows換行符\r\n而不僅僅是\n。因此,在\n處分割將導致每個其他數組索引中的\r條目。

這些\r將「激發」正則表達式.test()方法,因爲它不是字母數字。

試試這個

var textValues = textToTest.split("\r\n"); 
1

的這裏的問題是,你正在使用您正則表達式的g(全球)修改。

運行這段代碼在你的JS控制檯檢查test()回報交替truefalse

r = /([A-Za-z0-9]+)/g 
r.test('a') 
> true 
r.test('a') 
> false 
r.test('a') 
> true 
... 

在正則表達式刪除g修改結果總是一個匹配字符串返回true。由於您僅使用多行修改器m+(一個或多個匹配)測試一個字符也是不必要的。