匹配三个正则表达式中的任何一个(以javascript为准)

时间:2016-05-01 02:30:29

标签: javascript regex loops

所以基本上我有一段单词,我有三种可能的模式标记段落的结尾,比如regex1,regex2和regex3都是以/.*?(?=something)/格式。如果段落中没有它们,我将返回整个段落。如果全部存在,我想匹配第一个出现的正则表达式之前的单词。如果这是输入,请说:

 word word word word regex3 word word word regex2 word word regex1

我希望在这种情况下返回前四个单词。如果是:

 word word word word regex1 word word word regex3 word word regex2

我还想在这种情况下返回前四个单词

另一种可能的输入可能是:

 word word regex1 word word word regex1 word regex2 regex3

在这种情况下,我只需要前两个单词

一个"讨厌"我能想到的方法是做一大堆嵌套if else,但这需要我的程序运行永远。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

奇怪的情况,但我会做的是根据正则表达式拆分你的字符串(我会或它们一起合成一个正则表达式)然后返回结果数组中的第一个字符串

类似

thestring.split(/regex1|regex2|regex3/)[0]

如果你的正则表达很长而且很粗糙,你可以将上面的链接结合起来并且仍然得到相同的结果

thestring.split(/regex1/)[0].split(/regex2/)[0]...etc

答案 1 :(得分:0)

我认为这应该有效。欢迎提出改进建议!

var regex1; // = /.*?(?=something)/;
var regex2; // = /.*?(?=something)/;
var regex3; // = /.*?(?=something)/;

function testString(str) {
    var res1 = str.match(regex1);
    var res2 = str.match(regex2);
    var res3 = str.match(regex3);

    // Number.MAX_VALUE = 1.7976931348623157e+308
    if (!res1) res1 = {index: Number.MAX_VALUE};
    if (!res2) res2 = {index: Number.MAX_VALUE};
    if (!res3) res3 = {index: Number.MAX_VALUE};

    var min = Math.min(res1.index, res2.index);
    min = Math.min(min, min3.index);

    return str.substring(0, min);
}

答案 2 :(得分:0)

您想使用negative lookahead进行此操作..

var paragraph = "word word word regex1 word regex2 word";
paragraph.match(/^(?:(?!regex1|regex2).)*/);

基本上,正如正则表达式解析你的段落字符串一样,它确保接下来发生的任何事情都是而不是你的终止案例,如果是,那就完成了。

Demo