2017-10-17 65 views
0

我有一個Javascript迭代/正則表達式,這一直使我瘋狂,希望有人能提供一些見解,因爲我遇到的挑戰似乎是JS特有的東西。正如你所看到的,我檢查正則表達式的表達式來檢查字符串是否在字符串中出現2次或更多次,如果它沒有,則返回指定索引處的字母。但是,對於諸如「測試」的字符串,儘管字符串中存在兩次「t」,它仍會返回「t」。然而,其他字符串,如「aaaaac」,它會正確返回「c」。我已經在Rubular中測試過它,而正則表達式表達正常,所以我一直無法確定它爲什麼在這種情況下不起作用。Javascript正則表達式不會返回預期值

function found (str) { 
    for (const number in str) { 
    let regex = new RegExp(str[number] + "{2,}"); 
    if (!str.match(regex)) { 
     return str[number] 
    } 
    } 
} 

我將不勝感激任何可以提供的見解!

回答

1

t{2,}試驗的t兩個或更多個緊鄰實例。它匹配attackattttack,但不匹配testing,它從不包含雙字符序列tt

取而代之,您需要某種形式的t.*t,它測試t,然後是零個或多個字符,然後是某個點上的另一個t。嘗試改爲:

new RegExp(str[number] + ".*" + str[number]); 

但是,請注意有代碼的幾個有關性能,無關這個問題:

  • 使用for - in環路包括所有可枚舉的屬性,這可以包括超過字符串中字符的索引。如果庫使用枚舉屬性擴展String.prototype,它將包含在循環中,這可能會導致意外的結果。代之以選擇從0str.length-1的數字循環。

  • 你的動態創建的正則表達式不淨化輸入,如果測試正則表達式特殊字符,如.*?這可能會導致問題。見Is there a RegExp.escape function in Javascript?

+0

謝謝!這真的可以澄清事情! – Dog

1

x{n,m}正則表達式模式匹配x的序列。在「測試」一詞中,t是分開的,並且模式不匹配它們。

搜索使用全局g標誌數組中的字母全部出場,然後比較與您的閾值(2)找到匹配的數目:

function found (str) { 
 
    for (const number in str) { 
 
    const regex = new RegExp(str[number], 'g'); 
 
    const match = str.match(regex); 
 
    if (!str.match(regex) || match.length < 2) { 
 
     return str[number]; 
 
    } 
 
    } 
 
} 
 

 
console.log(found('testing'));

1

的錯誤在你的正則表達式中,它只匹配連續字符,「aaaac」是一個特定的測試。所以爲了工作,只需改變它。

function found (str) { 
    for (const number in str) { 
    let regex = new RegExp(str[number] + ".*" + str[number]); 
    if (!str.match(regex)) { 
     return str[number] 
    } 
    } 
}