2013-08-21 46 views
1

我想匹配星號字符*但只有當它發生一次。只匹配一個不重複出現的字符與Javascript正則表達式

我曾嘗試:

/\*(?!\*)/g 

,檢查前面,看看下一個字符是星號。這讓我接近,但我需要確保以前的字符也是而不是星號。不幸的是,javascript不支持負面lookbehind。

澄清:

This is an ex*am*ple 

應該相互匹配星號,但:

This is an ex**am**ple 

不應返回任何比賽的。

在此先感謝

+0

你想只匹配星號字符,還是提取一個足夠的組?請注意,即使支持該語法,您的嘗試也不起作用。 – OrangeDog

+0

我只想匹配星號。該嘗試僅檢查前進,以查看下一個字符是否爲星號,但不會嘗試向後檢查,這是我相信我需要做的。 – Gordo

+0

這不可能通過單個正則表達式來執行。 – OrangeDog

回答

3
var r = /(^|[^*])(\*)([^*]|$)/; 

r.test('This is an ex*am*ple'); // true 
r.test('This is an ex**am**ple'); // false 
r.test('*This is an example');  // true 
r.test('This is an example*');  // true 
r.test('*');      // true 
r.test('**');      // false 

在所有情況下,匹配星號是捕獲組2.

對於一個完整的解決方案,而不是使用正則表達式:

function findAllSingleChar(str, chr) { 
    var matches = [], ii; 

    for (ii = 0; ii < str.length; ii++) { 
    if (str[ii-1] !== chr && str[ii] === chr && str[ii+1] !== chr) { 
     matches.push(ii); 
    } 
    } 

    return matches.length ? matches : false; 
} 

findAllSingleChar('This is an ex*am*ple', '*'); // [13, 16] 
findAllSingleChar('This is an ex**am**ple', '*'); // false 
findAllSingleChar('*This is an example', '*'); // [0] 
findAllSingleChar('This is an example*', '*'); // [18] 
findAllSingleChar('*', '*');      // [0] 
findAllSingleChar('**', '*');      // false 
+0

謝謝,我看到在我的情況下,這樣做的最好方法是匹配所有出現的星號,然後檢查長度是否爲1 – Gordo

+0

顯然,如果您正在搜索,findAllSingleChar不起作用爲NUL(''\ 0''); – OrangeDog

+0

太棒了......一個非常簡潔的答案。乾杯! – Gordo

相關問題