javascript解析字符串之间的字符串

时间:2013-11-17 13:20:56

标签: javascript

我想根据开始和结束字符串模式从另一个字符串中解析一个字符串。

示例是解析ip地址,但这可以是任何字符串,而不一定是IP。

是否有更好/更有效的方法:

function parse(str,start,end){
    var ls = str.indexOf(start);
    if(str && ls !== -1) return str.substring(ls+start.length,str.indexOf(end,ls));
    return false;
}

var res = "wlan0: adding default route via 192.168.0.1";
console.log(parse(res,"route via ","\n"));
  

192.168.0.1

2 个答案:

答案 0 :(得分:1)

您可以考虑使用正则表达式。这可能是一个通用的开头(请查看here以获得正确的RegExp.escape方法):

function parse(str, start, end) {
    var start_expr = RegExp.escape(start);
    var end_expr = RegExp.escape(end);
    var regex = new RegExp( start_expr + "(.*)(?=" + end_expr + ")" );
    var match = str.match(regex);
    return match[1];
}

您可能需要根据需要进行调整,因为正则表达式可能不会直接接受您习惯的某些转义序列(例如,在您的示例中为“\ n”)。

答案 1 :(得分:1)

你可以把它清理一下:

function parseSubstring(str, after, until) {
    var pos0 = after ? str.indexOf(after) : 0,
        posS = pos0 > -1 ? pos0 + after.length : str.length,
        posE = until ? str.indexOf(until, posS) : str.length;

    if (posE >= posS) {
        return str.substring(posS, posE);
    }
}

var input = "wlan0: adding default route via 192.168.0.1",
    part = parseSubstring(input, "route via ");
    // -> "192.168.0.1"

一般情况下,如果您实际上不想返回布尔值,请不要返回false。这不是PHP,返回false表示错误是错误的事情。如果没有定义函数的结果,则根本不返回。


您还可以扩充String原型。

String.prototype.snip = function(after, until) {
    var pos0 = after ? str.indexOf(after) : 0,
        posS = pos0 > -1 ? pos0 + after.length : this.length,
        posE = until ? this.indexOf(until, posS) : this.length;

    if (posE >= posS) {
        return this.substring(posS, posE);
    }
}

var input = "wlan0: adding default route via 192.168.0.1",
    part = input.snip("route via ");
    // -> "192.168.0.1"

请注意,如果不将until参数传递到“直到字符串”的末尾。传递after参数中的空字符串将从开头“”转换为