我有一个正则表达式

(\/)?([\s\S]+)(?:@bigletterbot)?


当我匹配时:/random@bigletterbot

预期产量:

["/random@bigletterbot","/","random"]

但是它给

["/random@bigletterbot","/","random@bigletterbot"]

而且当我比赛时

HelloWorld!

它给出了期望的输出。我在regex101.进行了测试

请告诉我我在做什么错。

要求:

/是可选的,如果存在则应捕获,
[\s\S]+是要捕获的:
可以是:
HelloWorld
 要么
Hello @ World我认为@很难使[^@]+工作正常
 第三部分是可选字符串@bigletterbot,不应捕获

最佳答案

您可以用来匹配和捕获可选的/后跟任何字符的正则表达式是,但不带单词字符的@@符号是

(\/)?([^@]*(?:@\B[^@]*)*)


请参见regex demo

我添加的部分是[^@]*(?:@\B[^@]*)*


[^@]*-@以外的0+个字符
(?:@\B[^@]*)*-0+序列:


@\B-@后面没有单词字符(因为\B是非单词边界)
[^@]*-@以外的0+个字符



当一个子字符串不被“匹配”时(您说@something不应被捕获,但实际上意味着它不应该被匹配),这意味着您需要匹配该子字符串。因此,否定的字符类解决方案在这里是最好的,但是有点复杂,因为要允许@ +非单词字符组合。 \B应该可以应付这些情况,因为用户名应符合@\w+模式(因此,所有@mentions将被安全地阻止与@\B匹配)。

07-24 17:02
查看更多