gpt4 book ai didi

javascript - 如何修复此@mention 正则表达式?

转载 作者:行者123 更新时间:2023-11-30 15:31:59 26 4
gpt4 key购买 nike

我想捕获对@usernames 的提及。用户名有这些规则:

  • 只能使用小写字母、数字或点 (.)
  • 不以点开头或结尾
  • 连续不超过一个点(例如,不允许使用 user..name,但可以使用 us.er.name)

所以,我想到了这个:

/(?:^|\s)(@)(?!\.)(?!.*\.\.)(?!.*\.[\s|$])([a-z0-9\.]+)(?:\s|$)/gm;

应该是:

 (?:^|\s) starting at start of line, or with a whitespace
(@) having a @
(?!\.) name not starting with a dot
(?!.*\.\.) not containing two adjacent dots (..)
(?!.*\.[\s|$]) not ending with a dot (yes this sucks)
([a-z0-9\.]+) allowed chars
(?:\s|$) ending at EOL or whitespace

作为一个完全的正则表达式菜鸟,我很高兴看到它在一个长的多行测试字符串上的表现如何。但后来我尝试了最简单的测试字符串,比如:

@foo @bar I hate you both.

在这种情况下,foo 被捕获,但 bar 没有。我想,即使我使用非捕获组,@foo 也会使用以下空格,因此 @bar(?:^|\s)

我应该如何编辑此正则表达式以使其正常工作?

请不要建议完全不同的@mention 正则表达式,我可以很好地搜索它们,因为还有其他问题。我只是想让它工作,并想知道它为什么不工作。

最佳答案

一般来说,您在这里遇到的问题是您对单词开头和结尾的空格使用了捕获组,这意味着这些字符会被进一步的 RegEx 匹配消耗掉。

这是因为你做了:(?:...) .

相反,您可以使用一种不消耗字符的特殊捕获组,称为 Lookahead:(?=...)

RegEx中有Lookbehind AND Lookahead,分别检查RegEx前后。对您的问题的完美回答将同时使用 lookbehind 作为字符串的开头 (?<=^|\s)并向前看字符串的末尾 (?=\s|$) .不幸的是,在 Javascript 中,Lookbehind 不受支持,但对于您的特定需求,我们可以解决这个问题。

如果我们确保不捕获用户名末尾的尾随空格,则它可用于匹配您在 RegEx 开头定义的捕获组。这是代码:

(?:^|\s)(@)(?!\.)(?!\S*\.\.)(?!\S*\.[\s|$])([a-z0-9\.]+)(?=\s|$)

请注意,除了最后一节中的“=”、“不以点结尾”部分中的“\S”和“不包含两个相邻的点”之外,其他内容几乎相同,您在下面的评论。

可以查到结果here .不幸的是,这会返回包含“@bar”空格的完整匹配项,但该匹配项的子组看起来仍然不错。

如果这有帮助,请告诉我!

关于javascript - 如何修复此@mention 正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42103580/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com