简体   繁体   中英

Regular Expression to exclude a certain pattern

I am trying to find the count of number of occurrences of a substring in a string using

function countOccurences(str,word){
   var regex = new RegExp("\\b"+word+"\\b","gi");
    console.log((str.match(regex)|| []).length);
}


let String=' test TEST TESTING Test I like testing <h3>TEST</h3> class="test id="test" ';

let asset="Test";
countOccurences(String,asset);

Here, the result I am getting is 6 , which is ok as I want the exact match, but I want to exclude the test of class and id , so that the result I get is 4 and not 6 .

You can form a regex that will match and capture the substrings you would like to skip when counting and match the asset in other contexts only.

The sample regex may look like

/\b((?:id|class)="Test\b)|\bTest\b/gi

This will match

  • \\b((?:id|class)="Test\\b) - word boundary, Group 1 capturing id or class , then ="Test as a whole word
  • | - or
  • \\bTest\\b - whole word Test

See the JavaScript demo:

 function countOccurences(str,exceptions,word){ const pattern = "\\\\b((?:" + exceptions.map(x => x.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&')).join("|") + ')="' + word + "\\\\b)|\\\\b"+word+"\\\\b"; const regex = new RegExp(pattern,"gi"); let count = 0, m; while (m = regex.exec(str)) { if (!m[1]) { count++; } } console.log(count) } let text = ' test TEST TESTING Test I like testing <h3>TEST</h3> class="test id="test" '; let asset="Test"; let exception_arr = ["id", "class"] countOccurences(text,exception_arr,asset); // => 4

Another solution is based on the negative lookarounds (not support in all JavaScript environments yet):

 function countOccurences(str,exceptions,word){ const pattern = "\\\\b(?<!\\\\b(?:" + exceptions.map(x => x.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&')).join("|") + ')=")'+word+"\\\\b"; const regex = new RegExp(pattern,"gi"); console.log((str.match(regex) || ['']).length); } let text = ' test TEST TESTING Test I like testing <h3>TEST</h3> class="test id="test" '; let asset="Test"; let exception_arr = ["id", "class"] countOccurences(text,exception_arr,asset);

Here, /\\b(?<!\\b(?:id|class)=")Test\\b/gi regex will match any Test as a whole word if it is not immediately preceded iwth id or class as whole words followed with =" substring.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM