正则表达式字符串不再识别字符串中的用户名标签 [重复]

Posted

技术标签:

【中文标题】正则表达式字符串不再识别字符串中的用户名标签 [重复]【英文标题】:Regex string is no longer identifying username tags in a string [duplicate] 【发布时间】:2022-01-23 22:54:52 【问题描述】:

每当我的用户之前在我的网站上写过评论时,它只会保存他们写的文本字符串,我可以使用以下正则表达式代码识别字符串中包含的用户名标签...

const GetTags = inputString => 
    var regex = /(?:^|\s)(?:@)([a-zA-Z\d]+)/gm
    var matches = []
    var match

    while ((match = regex.exec(inputString)))
        matches.push(match[1])
    

    return matches;

此代码返回评论中所有用户名的数组,例如[will、john_tobeck、tomey1234 等]。我现在已经将输入更改为另存为降价,以便为用户提供更多使用 cmets 的选项,但现在这个正则表达式不再有效,有谁知道我将如何使用来自 html 字符串的正则表达式匹配所有@用户名,看起来像这……

<p>
    <span><b>Hey @will are you free on Friday?</b></span>
</p>
<p>I think @tom, @jak_123 and @123bob are going as well now.</p>

可能的用户名字符是数字、字母和下划线。我认为现有正则表达式的问题是没有拾取 符号旁边的任何内容。

【问题讨论】:

也许你想要var regex = /\B@(\w+)/g 或者匹配尖括号(?:^|[\s&gt;&lt;])@([a-zA-Z\d]+) 只有当用户名紧跟在 &gt; 字符之后时,正则表达式才会失败,更宽松的正则表达式将是 (?:@)([a-zA-Z\d]+) 我认为它在节点的正则表达式中找不到。如果您将 inputString 更改为字符串(模板文字)并尝试相同。它会工作 如果可行,我可以提供答案 【参考方案1】:

这个正则表达式对我有用:\@([^&lt;|\s]+)

使用此文本:

<p>
    <span><b>Hey @will are you free on Friday?</b></span>
</p>
<p>I think @tom, @jak_123 and @123bob are going as well now.</p>

我收到了以下组:

22-26   will
79-83   tom,
85-92   jak_123
98-104  123bob

【讨论】:

【参考方案2】:

您的模式要么断言字符串的开头,要么匹配一个空白字符。如果@直接在尖括号之后,您也可以通过将它们添加到字符类来匹配它们。

注意,您不需要围绕 @ 的非捕获组,也不必转义它。

(?:^|[\s><])@([a-zA-Z\d]+)
(?:非捕获组 ^ 字符串开始 |[\s&gt;&lt;] 匹配空格字符 &lt;&gt; )关闭非捕获组 @ 字面上匹配 ([a-zA-Z\d]+) 捕获组 1,匹配字符类中列出的任何一个 1+ 次

Regex demo

const str = `<p>
    <span><b>Hey @will are you free on Friday?</b></span>
</p>
<p>I think @tom, @jak_123 and @123bob are going as well now.</p>
<p>@test</p>`;

const GetTags = inputString => 
  var regex = /(?:^|[\s><])@([a-zA-Z\d]+)/g;
  var matches = [];
  var match;

  while ((match = regex.exec(inputString))) 
    matches.push(match[1])
  

  return matches;

console.log(GetTags(str));

简而言之

const str = `<p>
    <span><b>Hey @will are you free on Friday?</b></span>
</p>
<p>I think @tom, @jak_123 and @123bob are going as well now.</p>
<p>@test</p>`;

const GetTags = inputString =>
  Array.from(
    inputString.matchAll(/(?:^|[\s><])@([a-zA-Z\d]+)/g),
    m => m[1]
  );
console.log(GetTags(str));

【讨论】:

以上是关于正则表达式字符串不再识别字符串中的用户名标签 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

【Django】路由配置:反向解析、重定向

正则表达式识别字符串中的URL

正则表达式怎么识别特定的中文字符

删除正则表达式中的 Html 标签 [重复]

Javascript/jQuery - 使用正则表达式解析字符串中的主题标签,URL 中的锚点除外

在 Python 中使用正则表达式匹配两个字符串中的 HTML 标签