所以基本上我有一段单词,我有三种可能的模式标记段落的结尾,比如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,但这需要我的程序运行永远。有什么想法吗?
答案 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).)*/);
基本上,正如正则表达式解析你的段落字符串一样,它确保接下来发生的任何事情都是而不是你的终止案例,如果是,那就完成了。