我是一个正则表达式
(\/)?([\s\S]+)(?:@bigletterbot)?
匹配时:/random@bigletterbot
预期产出:
["/random@bigletterbot","/","random"]
然而它正在给予
["/random@bigletterbot","/","random@bigletterbot"]
此外,当我匹配时
Hello
World!
它提供了所需的输出。我在regex101.
进行了测试请告诉我我做错了什么。
要求:
/
是可选的,如果存在则应该被捕获,
[\s\S]+
意图被捕获:
可以是:
Hello
World
或
Hello @ World
我认为 @ 使其变得困难,否则 [^@]+
应该正常工作
第三部分是可选字符串@bigletterbot
,未被捕获
答案 0 :(得分:1)
正则表达式可用于匹配和捕获可选/
后跟任何字符,但@
或@
符号后面没有单词字符
(\/)?([^@]*(?:@\B[^@]*)*)
请参阅regex demo
我添加的部分是[^@]*(?:@\B[^@]*)*
:
[^@]*
- 除@
(?:@\B[^@]*)*
- 0+序列:
@\B
- @
没有后跟单词字符(因为\B
是非单词边界)[^@]*
- 除@
当子串不是“匹配”时(你说@something
不应该捕获,但实际上意味着它不应该匹配),这意味着你需要匹配到那个子串。因此,否定的字符类解决方案在这里是最好的,但它很复杂,因为你想允许@
+非单词字符组合。 \B
应该处理这些情况,因为用户名应符合@\w+
模式(因此,所有@mentions将被安全地停止与@\B
匹配)。
答案 1 :(得分:0)
好吧,请尝试使用正则表达式:
/((\/?)([^@]+).*)/g
根据您的示例输入,输出将为:
1. `/random@bigletterbot`
2. `/`
3. `random`
尝试demo