regex 以char开头但不以该char结尾的单词的正则表达式

z6psavjg  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(112)

我想在一个字符串中找到以@开头但不以它结尾的空格之间的序列。即找到“关键字,但不是”东西“。例如

"@hello how are @you? I am @good, thank @you! But @bad@ is not okay."

应该匹配“你好”,“你”,“好”,“你”,但不坏
我和GPT 4认为这应该起作用,但它没有

/@[^\s]+(?<!@)/

无论是这个还是其他的组合

/@[a-zA-Z0-9_]+(?<![@\s])/
fykwrbwg

fykwrbwg1#

你可以使用这个正则表达式来进行负的前瞻:

@[^@\s]+\b(?!@)

RegEx Demo

RegEx详情:

  • @:匹配@
  • [^@\s]+:匹配任何不是@且不是空白的字符的1+
  • \b:字边界
  • (?!@):负向前查找,Assert下一个字符不是@
1cosmwyk

1cosmwyk2#

考虑到您的示例字符串仅包含可以使用的单词字符,

(?<=@)\w+\b(?!@)

参见regex demo

  • 详情 *:
  • (?<=@)-一个正向后查找,需要在当前位置的左边立即添加一个@字符
  • \w+-一个或多个单词字符
  • \b-一个单词边界(如果后续的前瞻检查失败,它将停止引擎回溯到\w+模式,如果找到像@abc@这样的子串,我们将不会得到任何匹配)
  • (?!@)-一个负的前瞻,不允许@字符直接到当前位置的右边。
xmjla07d

xmjla07d3#

我想在字符串中找到以@开头但不以它结尾的空格之间的序列
显然,您还希望只匹配单词字符,在这种情况下,您可以使用\w

@(?<=(?<!\S@))\w+(?!\S*@(?!\S))
  • @(?<=(?<!\S@)) Match @并在它之前Assert一个whitspace边界
  • \w+匹配1+字字符
  • (?!\S*@(?!\S))Assert“word”不以@结尾

Regex demo

相关问题