正则表达式JavaScript捕获直到(之前)可选字符串

时间:2016-03-15 15:51:54

标签: javascript regex

我是一个正则表达式

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

匹配时:/random@bigletterbot

预期产出:

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

然而它正在给予

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

此外,当我匹配时

Hello World!

它提供了所需的输出。我在regex101.

进行了测试

请告诉我我做错了什么。

要求:

/是可选的,如果存在则应该被捕获,

[\s\S]+意图被捕获:
可以是:
Hello World

Hello @ World 我认为 @ 使其变得困难,否则 [^@]+ 应该正常工作

 第三部分是可选字符串@bigletterbot未被捕获

2 个答案:

答案 0 :(得分:1)

正则表达式可用于匹配和捕获可选/后跟任何字符,但@@符号后面没有单词字符

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

请参阅regex demo

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

  • [^@]* - 除@
  • 以外的0个字符
  • (?:@\B[^@]*)* - 0+序列:
    • @\B - @没有后跟单词字符(因为\B是非单词边界)
    • [^@]* - 除@
    • 以外的0个字符

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

答案 1 :(得分:0)

好吧,请尝试使用正则表达式:

/((\/?)([^@]+).*)/g

根据您的示例输入,输出将为:

1.  `/random@bigletterbot`
2.  `/`
3.  `random`

尝试demo