Javascript:正则表达式在最后一次出现的字符串和另一个字符串

时间:2017-05-03 12:53:48

标签: javascript regex

我想找到最后一次出现在"和#34;之间的文字。在一个句子和另一个词"玛丽"。

所以,对于句子

"我星期五早上去睡觉,然后到达那件事,然后心爱的玛丽"

我的正则表达式应匹配字符串"心爱的"。

我尝试过以下代码:

var str = "I went on Friday morning to  bed, then to arrive for that 
thing and then to beloved Mary";
var r = /to\b(.*)Mary/g
var match = r.exec(str);
console.log(match);

我正在使用全局标志,因为我希望将所有出现的单词"匹配到"。我期待它返回一个字符串数组,其中一个是字符串"心爱的"但我得到的输出是:

  

["睡觉,然后到达那个东西,然后心爱的玛丽","床,然后到达那个东西,然后心爱的"]

Jsbin在这里:

http://jsbin.com/puyijo/edit?js,console

有什么建议吗?

编辑:" Mary"不一定在字符串的最后。

4 个答案:

答案 0 :(得分:2)

由于您正在寻找to last ,您可以贪婪地使用to .*的任何其他实例:

 /.*to\b(.*)Mary/

根据您所描述的要求,/g不是必需的,因为只有一个“最后一次出现to

答案 1 :(得分:0)

你需要在实际的to-Mary序列之前匹配一些东西:

var r = /.+to(.+)Mary/

您也不使用组标记。

然后您的匹配组是第一组:match[1]

请注意,如果您可能希望修剪结果,或在正则表达式中添加组外部的其他字符,例如\s,;\.如果您只想要中间的单词,则不会捕获这些内容。

干杯。

答案 2 :(得分:0)

默认情况下,正则表达式解析器是贪婪的,因此它将首先尝试从第一次出现的to开始。

您需要使用.*

丢弃所有以前的字符
/.*to\b *(.*?) *\bMary/g

答案 3 :(得分:0)

尝试此模式/(to)(?!.*\1)(.*)Mary/g

  1. '(to)(?!.*\1)'匹配上一个to
  2. (.*)找到toMary
  3. 之间的文字

    Demo Regex

    var str = "I went on Friday morning to  bed, then to arrive for that thing and then to beloved Mary";
    var r = /(to)(?!.*\1)(.*)Mary/g;
    var match = r.exec(str);
    console.log(match[2]);