【问题标题】:Regex for hashtags at the very begining not works in C# but works in Javascript一开始标签的正则表达式在 C# 中不起作用,但在 Javascript 中起作用
【发布时间】:2017-05-19 11:43:41
【问题描述】:

伙计们!

我写了我需要的这种正则表达式

^((#\w+\b(\s?|#))+)

它工作正常......但只有here(在Javascript模式下)。

如您所见,它会突出显示所有行,直到没有标签符号的文本开始(我只需要从文本的最开头获取它们)。

如果我在http://regexstorm.net/tester 尝试这样的事情,它看起来像这样(所以我不需要完全捕获部分内容,ECMAScript 选项也无济于事)

为 C# 修复它的最佳方法是什么?为什么它不能那样工作(因为在 regex101 的其他选项中一切看起来都不错)?

【问题讨论】:

  • @ClasG:不,\s*。 RegexStorm 默认换行样式为 CRLF,而 regex101 使用的是 LF。见demo
  • @WiktorStribiżew 你好!哦,该死的,我坚持我试过那个,但实际上我没有
  • 在 RegexStorm 中添加 Multiline 选项
  • @FedericoDipuma multiline 在这里不是一个选项,因为我需要坚持一开始
  • 不应该是^#\w+(?:\s*#\w+)*吗?一个主题标签,后跟 0+ 个由 0+ 个空格和主题标签组成的序列?

标签: javascript c# regex


【解决方案1】:

主要问题是 Regex101 和 RegexStorm 站点之间的换行样式不同:第一个使用 LF,后者使用 CRLF 样式。因此,\s? 仅匹配 1 或 0 个空格无法在 RegexStorm 中找到匹配项,因为在第一行的结尾和第二行的开头之间有两个空格。

您可以修复它,将 \s? 更改为 \s*(或至少 \s{0,2} 以匹配 0 到 2 个空格)。

但是,您的正则表达式需要改进,因为它会导致正则表达式引擎的开销过多。你可以把它线性写成

^#\w+(?:\s*#\w+)*

请参阅RegexStorm regex demo。它匹配一个主题标签,后跟 0+ 个由 0+ 个空格组成的序列和一个主题标签。

请注意,^ 可以重新定义以匹配 的开头。为避免这种情况,在 .NET 中,您可以使用始终与字符串开头匹配的 \A 锚点。

模式详情

  • ^(或\A) - 字符串的开头
  • #\w+ - # 后跟 1+ 个单词字符
  • (?:\s*#\w+)* - 零个或多个序列:
    • \s* - 零个或多个空格
    • #\w+ - 标签模式。

【讨论】:

  • 哦,这个正则表达式好多了
  • 它也比前一个快了 ~67%。在regexhero.net/tester 执行基准测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多