c# - 正则表达式完全匹配特定字符的 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_relRef
和ATAT_absRef
)
解决方案
您的正则表达式匹配两者,因为[^\s]
它匹配任何字符,但空格也会匹配@
字符。在这[^@]
两种情况下都匹配一个空格,所以它没有足够的帮助。此外,@{1}
与 相同@
,{1}
量词在任何正则表达式中总是多余的。
您可以使用
(?<!@)@[^\s@]\S*
请参阅正则表达式演示。
细节
(?<!@)
- 没有@
在当前位置之前@
- 一个@
字符[^\s@]
- 除了@
和空格之外的字符\S*
- 0 个或多个非空白字符。
至于第二种情况,负面的后视也可以:
(?<!AT)AT_\S*
请参阅正则表达式演示。它匹配
(?<!AT)
- 任何前面没有的位置AT
AT_
- 一个AT_
子串\S*
- 0+ 字符而不是空格。
推荐阅读
- excel - 如何从导入的excel文件中分离日期和时间?(拉拉维尔)
- jquery - 清空购物车后,updated_cart_totals 触发器不起作用
- esp8266 - ESP8266 问题上的卫星跟踪器
- mysql - 将 varchar(lower value) 数据类型更改为 varchar(higher value) 之间的区别,反之亦然
- flutter - Flutter/Dart - 无法使用静态访问访问实例成员“displayNotification”
- flutter - 我们如何像 fontAwesome Icons 一样在 Flutter 中添加引导图标(即 Half-Circle Icon)
- javascript - eslint 不忽略 node_modules 并在尝试 lint 时出错
- linux - 如何使用 qemu-system-x86_64 将多个内存对象添加到一个 numa 节点
- ios - react-native-maps:谷歌地图在 iOS 上显示为空白
- python - Pytube 给出“HTTP 错误 404:未找到”错误。任何人都知道如何解决这个问题?