如何检测带下划线的字符串的正则表达式模式

How to detect regex pattern for strings with underscore

我正在尝试创建一个正则表达式来检测一个字符串在另一个字符串中的确切出现次数。

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”字符串(like TEST_UF... or r_test or the regex-test_, "test " 未检测到字符串 )。 我需要帮助来检测这些字符串。

\b 匹配 单词边界 ,这是当单词字符(即与 \w 匹配的字符)遇到非单词字符时.像这样匹配单词边界在许多情况下都很有用,因为它不会捕获字符,但是您 运行 遇到 '_' 是单词字符的问题,因此如果您正在寻找单词边界那么你不会找到 '_test'.

JavaScript 个正则表达式中的单词字符为 [A-Za-z0-9_]。只要您像对待字母一样对待数字,下划线就应该是您唯一需要关心的不寻常字符。但是,由于您不想捕获下划线,因此您需要使用 a lookahead and a 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));

该示例在您的测试字符串中找到 9 个 'test' 实例,但它不是另一个词的一部分(例如 'Testing'),我相信这正是您所期望的?

但是,你应该知道support for lookbehind syntax是在ES 2018才加入的。如果你需要支持非现代浏览器,比如IE11,或者你需要支持Safari,那么这种方法就不行了'不适合你。

如果您只关心 counting 次出现,那么是否匹配字符并不重要,因此您可以取消先行和后行语法,只需直接匹配 _

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));