正则表达式正好匹配特定字符中的1个

时间:2019-07-28 19:14:24

标签: c# .net regex

我要匹配@relRef,但不匹配来自以下位置的@@absRef

Stuff @relRef more stuff @@absRef

据我了解,[^@]@{1}[^\s]*应该可以工作,但是仍然不能正确选择两者。 {1}代表我的意思吗? (我认为这意味着“将上一件商品精确匹配1次”)

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

最后,如果答案是多个字符,该答案最终会被更改。 (即,如果句子是Stuff AT_relRef more stuff ATAT_absRef,那么我现在不检查单个@字符,而是检查“ AT”。)

tl; dr:

1)为什么[^@]@{1}[^\s]*@@absRef匹配,如何解决它仅与@relRef匹配?

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

1 个答案:

答案 0 :(得分:1)

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

您可以使用

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

请参见regex demo

详细信息

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

对于第二种情况,后面的负向查找同样适用:

(?<!AT)AT_\S*

请参见regex demo。匹配

  • (?<!AT)-不以AT开头的任何位置
  • AT_-一个AT_子字符串
  • \S*-空格以外的0个字符。