【问题标题】:Regex for valid mention detection in the given scenario给定场景中有效提及检测的正则表达式
【发布时间】:2020-06-14 14:55:28
【问题描述】:

我想检测包含字母数字字符、破折号和下划线的用户名的提及。我目前正在使用以下正则表达式:

\b*@[a-zA-z0-9_-]+\b

它适用于简单的场景,但匹配以下文本中的两个 @nomatch 条目:

@match,

查看此链接! https://someurl.com/@nomatch/test。这是一些 文本和一些更多的文本和一些更多的文本。

它将如何处理 myemail@nomatch.net?

这是对 @match 的提及。这是对 @MaTch 的另一个提及。 @__ma-tch__ 太棒了。 @--match--@ma_tch@_MATCH

我们不要忘记 @__match__

此致,@match

我已经尝试为此编写更复杂的正则表达式,但是对于我修复的每个案例,我最终都会破坏另一个案例。

考虑到上述文本,什么是正则表达式可以匹配所有 @match(带有破折号和下划线变体)条目,但不匹配 @nomatch 条目?

编辑:为清楚起见,将所需匹配斜体表示。正则表达式引擎是 .NET Core,语言 C#。

【问题讨论】:

  • 注意\b* 无论如何都没有意义。你打算用什么来匹配它?你想匹配@--match-- 中的@--match-- 还是仅仅匹配@--match?另外,正则表达式的味道是什么?
  • 只是猜测:试试\B(?<!\/)@[a-zA-Z0-9_-]+。但请针对上述问题提供反馈。
  • @WiktorStribiżew 您的建议似乎很有效。为了清楚起见,我提供了修改,但如果您提交答案,我会接受

标签: .net regex .net-core


【解决方案1】:

\b* 模式没有意义,因为\b 需要单词边界位置,而* 使其成为可选,因此,使其不匹配任何内容,使其在模式中完全冗余。这就是为什么将零宽度断言(如锚点、单词边界、环视)设为可选是没有意义的。

你需要

\B(?<!/)@[a-zA-Z0-9_-]+

regex demo

详情

  • \B - 不是单词边界的位置
  • (?&lt;!/) - 如果在当前位置的左侧有一个 / 字符,则匹配失败
  • @ - 一个 @ 字符
  • [a-zA-Z0-9_-]+ - 1+ ASCII 字母、数字、下划线或连字符。

在 C# 代码中,您可以使用

var pattern = new Regex(@"\B(?<!/)@[\w-]+", RegexOptions.ECMAScript);

其中RegexOptions.ECMAScript option 将使\w 仅匹配ASCII 字母、数字和_,即与[A-Za-z0-9_] 相同。

【讨论】:

    猜你喜欢
    • 2017-01-15
    • 2011-11-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    相关资源
    最近更新 更多