匹配以@开头非@结尾的空格分隔序列的正则表达式问题
解决方案
要匹配空格分隔的@keyword格式(排除@something@),并提取其中的关键词,可以使用以下正则表达式:
(?<=^|\s)@(\w+)(?=[^\w@]|$)
正则解释
(?<=^|\s):正向回顾后发断言,确保@符号的前面是字符串开头或者空白字符,保证目标序列是被空格分隔的独立单元。@:匹配开头的@符号。(\w+):捕获组,匹配一个或多个字母、数字或下划线(即你需要提取的关键词部分)。(?=[^\w@]|$):正向预查,确保关键词后面的字符不是字母/数字/下划线,也不是@,或者已经到了字符串结尾。这一步会直接排除@bad@这类以@结尾的序列。
测试验证
将该正则应用到你的示例字符串:
"@hello how are @you? I am @good, thank @you! But @bad@ is not okay."
会成功捕获以下关键词:hello、you、good、you,完全符合需求,且不会匹配bad。
补充说明
如果你需要匹配包含标点的完整序列(比如@you?、@good,)而非纯关键词,可以使用这个正则:
(?<=^|\s)@[^\s]+(?<![@])
[^\s]+:匹配所有非空格字符(包括标点)(?<![@]):负向回顾后发断言,确保序列的最后一个字符不是@,排除@bad@这类格式。
内容的提问来源于stack exchange,提问作者tru7
相关产品推荐
相关产品推荐

