正则表达式:获取惰性字符串

时间:2018-10-29 15:30:47

标签: javascript regex

我正在使用一种接近javascript的语言为我的实习项目,但是我正在使用的正则表达式遇到问题,其要点是: 我有以下文字:

Article 1243fdsg Article hf453dfg Article ds g,f re d.4 '35 67f before here

我只需要获得

ds g,f re d.4 '35 67f

部分而不是整个字符串

我尝试了很多事情,并在网上进行搜索,但是找不到了, 到目前为止,我的正则表达式是:

Article.*?before here

edit:最后一个“ Article”和“ before here”之间的字符串可能包含最常用的阅读符号,并且由于时间不确定,因此大多数情况下还会包含空格和定额标记

2 个答案:

答案 0 :(得分:0)

您可以尝试使用“向前看正面” (?=)

向前看:查找表达式B紧随其后的表达式A:A(?=B)

Article [a-zA-Z0-9]+ (?=before here)

输出:

Article dsgfred43567f

演示: https://regex101.com/r/63BgC3/1

答案 1 :(得分:0)

一些需要注意的事情:

  • .与JavaScript中的换行符不匹配。如果需要,请改用[^](或[\S\s]
  • 确保Article在匹配的内容中不会再次出现。为此,您可以使用否定的前瞻:(?!Article)

这是建议的代码:

const text = `Article 1243fdsg Article hf453dfg Article dsgfred43567f
a line break, some spaces and 'punctuation'! before here`;

const result = text.match(/Article(((?!Article)[^])*)before here/);

console.log(result[1]);

如果需要包含Articlebefore here,则输出result[0]而不是result[1]

请注意,正则表达式并非始终是最有效的解决方案,当然当它们需要四处查看时也不一定。使用其他字符串方法,例如split,将获得更好的性能。例如:

const text = `Article 1243fdsg Article hf453dfg Article dsgfred43567f
a line break, some spaces and 'punctuation'! before here`;

const result1 = text.split("before here");
if (result1.length > 1) {
    const result = result1[0].split("Article");
    if (result.length > 1) {
        console.log(result.pop());
    }
}

这是更多代码,但可以保证更快。