我想根据开始和结束字符串模式从另一个字符串中解析一个字符串。
示例是解析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
答案 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
参数中的空字符串将从开头“”转换为。