如何使用正则表达式移除句子末尾带 # 或 $ 的单词

3

我有以下内容:

The moment #BTC, we have all $BTC been waiting for:We are happy to announce NIX Platform is rebranding to.. $NBT > $VOICE $NIX > $MUTE $ETH $BTC #BTC

我希望仅删除以 # 或 $ 结尾的单词,不删除中间的单词,因此上述字符串将看起来像这样。
The moment #BTC, we have all $BTC been waiting for:We are happy to announce NIX Platform is rebranding to..  >  > 

目前我有一个正则表达式#(?!(?:hashtag)\b)[\w-]+(?=(?:\s+#[\w-]+)*\s*$),它可以除去以#结尾但不是以$结尾的单词,不太确定我需要怎么修改才能包括以$结尾的单词。

2个回答

4
一个正则表达式的替代方案,包含一个单词边界和负向前瞻,以防止空格后面跟着任何单词字符。
[#$@]\w+\b(?!\W*\s\w)

正则表达式演示

正则表达式解释:

  • [#$@]: 匹配 #$@
  • \w+b: 匹配 1 个或多个单词字符,后跟单词边界
  • (?!\W*\s\w): 负向先行断言(Negative lookahead),确保当前位置后面没有含有空格的单词字符

或者,您还可以使用*原子组*来禁止回溯:

[#$@](?>\w+)(?!\W*\s\w)

2
我喜欢它 :-) 你是大师,我是学徒。 - The fourth bird
@anubhava .net不支持所有格限定词,有更好的方法吗?另外,我该如何添加另一个项目,希望它能删除带有#、$和@的单词。 - Zoinky
@Zoinky:请尝试使用以下代码:[#@$]\w+\b(?!\W*\s\w) - anubhava

3
你可以使用正向先行断言,并断言直到字符串结束为止,所有单词都以非单词字符开头。
[#$][^\s$#]+(?=(?:\s+[^\w\s]\S*)*\s*$)
  • [#$][^\s$#]+匹配#$字符,后面跟着1个或多个非空格、非#$的任意字符。
  • (?=正向前瞻,断言在右侧
    • (?:\s+[^\w\s]\S*)*可选重复项,其中包括1个或多个空格字符,后跟任何非空格或非字符的字符
    • \s*匹配可选的尾随空格字符
    • $字符串结束
  • )关闭前瞻

正则表达式演示


如果以$#开头的字符串可以包含另一个字符,那么另一种选择是使用带有捕获组和反向引用\1的贪婪记号的温和贪婪方法。

为了防止部分匹配,您可以在左侧加上断言空格边界。

(?<!\S)([#$])(?:(?!\1)\S)*(?=(?:\s+[^\w\s]\S*)*\s*$)

正则表达式演示


1
@anubhava 当然可以,我已经将其改为正向先行断言。你可以发布你的模式 :-) - The fourth bird
1
正向先行断言甚至更好 ++ - anubhava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接