正在开头的主题标签的正则表达式在C#中不起作用,但在Javascript中有效

时间:2017-05-19 11:43:41

标签: javascript c# regex

人!

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

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

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

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

如果我在http://regexstorm.net/tester尝试这样的事情,它看起来就像这样(所以我不需要完全捕获部分,ECMAScript选项也没有帮助) enter image description here

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

1 个答案:

答案 0 :(得分:2)

主要问题是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+ - 标签模式。