匹配单词和标点符号之间的所有内容

时间:2017-02-22 02:22:59

标签: javascript regex

尝试在Javascript中找出一些正则表达式,我希望匹配单词和行尾(或行尾的标点符号)之间的所有内容,但似乎无法使其正常工作。这就是我到目前为止所做的:

/^([\w\d]+)\s(is|are)\s([^\n\r.!?]+)/i

想要在以下所有情况下返回X,是/和Y:

  • X是Y!
  • X是Y?
  • X是/ .Y。
  • X是/是Y

如果就是这样,我会抓住所有不属于的人物。!? 但现实中的句子结构有时会最终成为:

User is test@example.com!!!

哪个不适用于。在电子邮件中,我想出了这个:

/^([\w\d]+)\s(is|are)\s(.*)[\.\!\?]*$/i

但是(。*)捕获包括末尾标点符号在内的所有内容。所以不要回来:

['User', 'is', 'test@example.com'] 

我得到了

['User', 'is', 'text@example.com!!!']

我在这里缺少什么?我如何让它忽略标点符号,但只有它们在字符串末尾?

1 个答案:

答案 0 :(得分:1)

将您的捕获组更改为(.*?)

,使其变得懒惰
> 'User is test@example.com!!!'.match(/^([\w\d]+)\s(is|are)\s(.*)[\.\!\?]*$/i).slice(1)
["User", "is", "test@example.com!!!"]
> 'User is test@example.com!!!'.match(/^([\w\d]+)\s(is|are)\s(.*?)[\.\!\?]*$/i).slice(1)
["User", "is", "test@example.com"]

问题出现了,因为在(.*)[\.\!\?]*中,下半场总是空的,上半场可以贪婪地消耗所有东西。如果您使用(.*?),则捕获组消耗尽可能少。