我正在创建一个递归js函数,它基本上解析一个字符串。我不能选择字符串的语法,所以我不能改变它。它由“,”分隔,工作正常,当它们在括号中时,它需要忽略括号内部,在这种情况下它需要在括号后分割。这是一个例子。
String: "h5, h7, (h5, h7, r3)7, h9"
它需要转换为一个看起来像
的字符串数组array( "h5", "h7", "(h5, h7, r3)7", "h9" );
我知道可能有一种方法可以用正则表达式来做,我有一个非常基本的正则表达式知识,但我无法弄明白。如果它有帮助,那就是我拥有的js代码。
cols = pattern.split(',');// This is where the regex would go.
$.each(cols, function(index, val){
val = $.trim(val);
var type = "";
var ctr = 0;
for(ctr = 0; ctr < val.length && isAlpha(val[ctr]); ctr++)
type += val[ctr];
if(val[0] == "("){
open = 1;
substr = "";
i = 1;
for(; i < val.length && open > 0; i++ ){
if(val[i] == ")"){
open--;
}
else
substr += val[i];
}
var repeater = val.substr(i);
if(isNumeric(repeater)){
for(j=0; j < repeater; j++){
colLen += updateRow(row, substr, false);
}
}
else{
$('#'+row).append('<a href="" >SE</a>');
colLen++;
}
}
// If it doesn't start with a parenthesis, do print it as usual
显然有更多代码,但这是相关部分。
抱歉如果我把它格式化错了,这是我的第一个问题。
答案 0 :(得分:1)
如果不是逗号,可以使用.split(',')
功能。我想分隔符不应该在字符串中显示未转义,但是如果你无法帮助它,那么你可以使用它:
[^,]*\([^\)]*\)[^,]*|[^,]+
它匹配括号中的任何内容(可以包含非逗号字符)或一组连续的非逗号字符。它只会匹配逗号分隔的内容,而不是逗号本身。
答案 1 :(得分:1)
以下是一些有效的强力方法:
方法1:匹配带括号的部分并暂时将其中的逗号替换为其他内容,以便您可以在逗号上拆分,然后将逗号放回带括号的部分。
var data = "h5, h7, (h5, h7, r3)7, h9";
var temp = data.replace(/\([^)]+\)/, function(match) {
return(match.replace(/,/g, "xx!xx"));
});
var splitData = temp.split(/\s*,\s*/);
for (var i = 0; i < splitData.length; i++) {
splitData[i] = splitData[i].replace(/xx!xx/g, ",");
}
// splitData = ["h5", "h7", "(h5, h7, r3)7", "h9"]
方法2:用逗号分割整个字符串,然后再将括号内的部分重新组合在一起:
var data = "h5, h7, (h5, h7, r3)7, h9";
var splitData = data.split(",");
var output = [], pieces, inParen = false;
for (var i = 0; i < splitData.length; i++) {
temp = splitData[i];
if (inParen) {
pieces += "," + temp;
if (temp.indexOf(")") != -1) {
inParen = false;
output.push(pieces);
}
} else {
temp = $.trim(temp);
if (temp.indexOf("(") != -1) {
pieces = temp;
inParen = true;
} else {
output.push(temp);
}
}
}
// output = ["h5", "h7", "(h5, h7, r3)7", "h9"]
您可以在此处看到这两项工作:http://jsfiddle.net/jfriend00/cs224/
答案 2 :(得分:0)
诀窍在于,您不想使用split()
来执行此操作 - 相反,您只想多次匹配正则表达式。像以下正则表达式之类的东西可以工作:
/\([^)]+\)|[^,]+/
(将一对parens与之间的任何内容匹配,或者不包含逗号的内容。)
var re = /\([^)]+\)[^,]*|[^,]+/g;
var items = input_string.match(re);
答案 3 :(得分:0)
您可以尝试使用特殊|普通排序进行更改,其中您首先尝试匹配棘手的括号子串,否则匹配正常:
var data = "h5, h7, 9(h5, h7, r3)7, h9";
var myregexp = /([^,]*?\([^)]*\)[^,]*|[^,]+)/g;
var match = myregexp.exec(data);
var result = "spans found:\n";
while (match != null) {
result += "match:" + RegExp.$1 + '\n';
match = myregexp.exec(data);
}
alert(result);
编辑:取出\w+
(字母数字),支持:[^,]
(非逗号)