计数字母前面没有另一个字母

时间:2017-08-06 05:32:24

标签: javascript regex

如何在JavaScript RegEx中实现以下计数? -

获取字母为B的字母A不会立即>以字母AB B AB开头。

示例:

  • B AB B => 1
  • A B A B => 2
  • BBB => 2
  • {{1}} => 3

经过多次试验这里给出的答案后,我发现在我的例子中没有值得使用的RegEx解决方案。所有以某种方式提供的解决方案都会导致代码明显慢于简单的算法方法。

3 个答案:

答案 0 :(得分:2)

我认为这应该像Hassan Imam在评论中所建议的那样起作用

function check(str){
	const regex = /(AB{0,1})| /g;
	const subst = '';
	const result = str.replace(regex, subst);
    console.log(result.length);
}
check('AB B AB');
check('B AB B');
check('B A B B');
check('A B A B');
check('BBB');

答案 1 :(得分:1)

您无法在Javascript中使用负面的后置(?<!A)B 它可以在Php,Python中工作但不能在Javascript中工作。 (https://regex101.com/r/MZhqSL/1
直截了当的方式:

&#13;
&#13;
var s = "AB B AB BB-B", count = 0;
    
for (i=0, l=s.length; i<l; i++) {
    if (s[i] === "B" && (i == 0 || s[i-1] !== "A")) count++;
}
    
console.log(count);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

据我所知,JavaScript并不支持负面的外观,所以我认为最好的办法是反转字符串并使用否定的前瞻。

function lookBehind(str) { //returns integer
  //split string into array
  //use <Array>.reverse()
  //Join array into string
  str = str.split('').reverse().join('');
  //reversed string ^
  return str.match(/b(?!(a))/gi).length; //the "i" flag makes the regex case insensitive.
}
console.log(lookBehind("AB B AB")); //1
console.log(lookBehind("B AB B")); //2
console.log(lookBehind("A B A B")); //2

More about lookarounds.