我要匹配@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_relRef
和ATAT_absRef
)
答案 0 :(得分:1)
您的正则表达式匹配这两者,因为[^\s]
匹配任何字符,但空格也匹配@
字符。 [^@]
在两种情况下都匹配一个空格,因此不够有用。另外,@{1}
与@
相同,{1}
量词在任何正则表达式中总是多余的。
您可以使用
(?<!@)@[^\s@]\S*
请参见regex demo。
详细信息
(?<!@)
-当前位置前没有@
@
-一个@
字符[^\s@]
-除@
和空格之外的字符\S*
-0个或多个非空白字符。对于第二种情况,后面的负向查找同样适用:
(?<!AT)AT_\S*
请参见regex demo。匹配
(?<!AT)
-不以AT
开头的任何位置AT_
-一个AT_
子字符串\S*
-空格以外的0个字符。