仅使用Javascript regexp匹配不重复出现的字符

时间:2013-08-21 09:12:19

标签: javascript regex

我正在尝试匹配星号字符*,但仅限于它出现一次。

我试过了:

/\*(?!\*)/g

提前检查下一个字符是否为星号。这让我很接近,但我需要确保前一个字符是星号。不幸的是,javascript不支持负面的lookbehind。

澄清:

This is an ex*am*ple

应匹配每个星号,但是:

This is an ex**am**ple

根本不应该返回任何匹配。

提前致谢

1 个答案:

答案 0 :(得分: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