首页 > 解决方案 > 正则表达式完全匹配特定字符的 1 个

问题描述

我正在尝试匹配@relRef但不是@@absRef来自:

Stuff @relRef more stuff @@absRef

据我了解,[^@]@{1}[^\s]*应该可以工作,但仍然错误地选择了两者。不{1}意味着我认为我做了什么?(我认为它的意思是“完全匹配之前的事情 1 次”)

[^@]@[^@][^\s]*确实有效,但对我的用例来说不太方便,更重要的是,我不明白为什么我的原始解决方案不起作用。

最后,如果它是多个字符,这个答案最终会改变吗?(即如果句子是Stuff AT_relRef more stuff ATAT_absRef这样的话,我现在不是检查单个 @ 字符,而是检查“AT”。)

tl;博士:

1)为什么[^@]@{1}[^\s]*匹配@@absRef以及如何将其修复为仅匹配@relRef

2) 如果我使用多个字符来标记引用,#1 的答案是否会改变?(即AT_relRefATAT_absRef

标签: c#.netregex

解决方案


您的正则表达式匹配两者,因为[^\s]它匹配任何字符,但空格也会匹配@字符。在这[^@]两种情况下都匹配一个空格,所以它没有足够的帮助。此外,@{1}与 相同@{1}量词在任何正则表达式中总是多余的。

您可以使用

(?<!@)@[^\s@]\S*

请参阅正则表达式演示

细节

  • (?<!@)- 没有@在当前位置之前
  • @- 一个@字符
  • [^\s@]- 除了@和空格之外的字符
  • \S*- 0 个或多个非空白字符。

至于第二种情况,负面的后视也可以:

(?<!AT)AT_\S*

请参阅正则表达式演示。它匹配

  • (?<!AT)- 任何前面没有的位置AT
  • AT_- 一个AT_子串
  • \S*- 0+ 字符而不是空格。

推荐阅读