正则表达式字符串不再识别字符串中的用户名标签 [重复]
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><])@([a-zA-Z\d]+)
只有当用户名紧跟在 >
字符之后时,正则表达式才会失败,更宽松的正则表达式将是 (?:@)([a-zA-Z\d]+)
我认为它在节点的正则表达式中找不到。如果您将 inputString 更改为字符串(模板文字)并尝试相同。它会工作
如果可行,我可以提供答案
【参考方案1】:
这个正则表达式对我有用:\@([^<|\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><]
匹配空格字符 <
或 >
)
关闭非捕获组
@
字面上匹配
([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));
【讨论】:
以上是关于正则表达式字符串不再识别字符串中的用户名标签 [重复]的主要内容,如果未能解决你的问题,请参考以下文章