正则表达式构建字符串直到遇到第N个匹配

时间:2015-03-31 13:16:24

标签: javascript regex

我正在尝试在JavaScript中构建一些RegEx来重制通过document.URL获取的URL。在搜索中,我偶然发现var match = str.match(/([^;]*;){2}/)[0];构建了一个字符串,直到第二次出现;,我需要它构建直到第/次出现。

虽然这只需要进行一些更改,但我还想将JavaScript变量传递给它,而不是让它变为静态。我将更新我的答案,因为我对JS RegEx进行了更多的研究,并发布了一个适合我的解决方案。

3 个答案:

答案 0 :(得分:0)

之前的答案似乎已被删除,但这是一个有效的解决方案,所以我将重新发布并根据我的知识进行解释

var n = 5 var re = new RegExp('([^/]*/){' + n + '}'); var result = str.match(re)[0]

n是您希望停止构建RegExp对象的地方

构建RegExp对象,以便它创建一个字符串,直到它到达第n /

result是对字符串运行RegExp并输出数组中的第一个结果

归功于vks的答案。我没有想到这一点。

答案 1 :(得分:0)

如果没有更多解释,很难准确说出你的意思,但这就是我如何解释你的问题:

function getPath(url, depth) {
    var match, re, results = [];
    for (var i = 1; i <= depth; i++) {
        re = new RegExp('([^/]*/){' + i + '}');
        match = url.match(re);
        if (match !== null) { results.push(match[1]); }
    }
    return results;
}

并在一个例子中使用它:

getPath('http://stackoverflow.com/questions/29369626/regex-to-build-string-till-it-encounters-nth-match', 5);
// returns
["http:/", "/", "stackoverflow.com/", "questions/", "29369626/"]

答案 2 :(得分:0)

你也可以使用这样的代码片段(我修改你的正则表达式使用非捕获组,现在,我们不需要使用索引):

&#13;
&#13;
var n = 5;
var re = new RegExp("(?:[^/]*/){" + n + "}");
var result = "Path/more/paths/here/andhere/file.php".match(re);
console.log(result);
&#13;
&#13;
&#13;

注意:在/构造函数中定义正则表达式模式时,无需转义RegExp符号。