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

Posted

技术标签:

【中文标题】如何检测带有下划线的字符串的正则表达式模式【英文标题】:How to detect regex pattern for strings with underscore 【发布时间】:2021-12-26 22:21:12 【问题描述】:

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

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_testregex-test_,未检测到“test”字符串)。 我需要帮助来检测这些字符串。

【问题讨论】:

点赞***.com/a/11808723/3832970 也许不是用 \b (单词边界)包围,而是可以尝试 \S - 非空白字符。例如。 [...str.matchAll(/\S*test\S*/gi)]. 请提供所有应该匹配的模式——到目前为止你说“test”和“test_”应该匹配。另外,告诉我们应该存在多少匹配?你的函数应该返回什么? 1、6、8、10? 【参考方案1】:

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

【讨论】:

我添加了关于浏览器支持和替代方案的编辑。 IE11 和 Safari 不支持正则表达式中的lookbehind 语法。

以上是关于如何检测带有下划线的字符串的正则表达式模式的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中如何用正则表达式检测某个字段是不是带有日文字符

如何转换使用 Lookahead 的正则表达式模式?

求一个正则表达式: 以英文字母开头,只能包含英文字母、数字、下划线

允许字母、数字、小数、空格和下划线的正则表达式模式

python 正则表达式

正则表达式:字母数字下划线和一些特殊字符