我有一个正则表达式
(\/)?([\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
匹配)。