我正在嘗試創建一個正則運算式來檢測一個字串在另一個字串中的確切出現次數。
function countOccurences(string, word) {
var regex = new RegExp("\\b" word "\\b", "gi");
return (string.match(regex) || []).length;
}
var str =
"TEST Testing TeSt case-test case@test <h1>Test</h1> www.test.com TEST_UF_3780_nix_inputs r_test regex-test_";
var asset = "test";
console.log(countOccurences(str, asset));
在這里,我得到了“test”字串的精確匹配,沒有其他任何東西,但它忽略了所有與它相關的下劃線前后的“test”字串(如TEST_UF ... 或r_test或regex-test_,未檢測到“測驗”字串)。我需要幫助來檢測那些字串。
uj5u.com熱心網友回復:
\b匹配一個詞邊界,即當一個詞字符(即匹配的\w)遇到一個非詞字符時。像這樣匹配單詞邊界在許多背景關系中都很有用,因為它不會捕獲字符,但是您遇到'_'了單詞字符的問題,因此如果您正在尋找單詞邊界,那么您將找不到'_test'.
JavaScript 正則運算式中的單詞字符是[A-Za-z0-9_]. 只要您以與處理字母相同的方式處理數字,下劃線就應該是您需要關心的唯一不尋常字符。但是,由于您不想捕獲下劃線,因此您需要使用lookahead 和 lookbehind。
嘗試這個:
function countOccurences(string, word) {
var regex = new RegExp("(\\b|(?<=_))" word "(\\b|(?=_))", "gi");
return (string.match(regex) || []).length;
}
var str =
"TEST Testing TeSt case-test case@test <h1>Test</h1> www.test.com TEST_UF_3780_nix_inputs r_test regex-test_";
var asset = "test";
console.log(countOccurences(str, asset));
該示例'test'在您的測驗字串中找到 9 個實體,當它不是另一個單詞(例如'Testing')的一部分時,我認為這是您所期望的?
但是,您應該知道對后視語法的支持僅在 ES 2018 中添加。如果您需要支持非現代瀏覽器,例如 IE11,或者您需要支持 Safari,那么這種方法將不適合您。
但是,如果您只關心計數出現次數,那么是否匹配字符并不重要,因此您可以取消前瞻和后視語法,直接匹配 for _。
function countOccurences(string, word) {
var regex = new RegExp("(\\b|_)" word "(\\b|_)", "gi");
return (string.match(regex) || []).length;
}
var str =
"TEST Testing TeSt case-test case@test <h1>Test</h1> www.test.com TEST_UF_3780_nix_inputs r_test regex-test_";
var asset = "test";
console.log(countOccurences(str, asset));
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/358694.html
標籤:javascript 正则表达式 细绳 字符串匹配
上一篇:如何在不使用“(?<!)”的情況下實作負向后視正則運算式?[復制]
下一篇:正則運算式到第1組的各種可能性
