拆分字符串的最佳方法是什么(对于复杂的正则表达式可能)?(javascript/jquery)
我正在创建一个递归js函数,它基本上解析字符串。我不能选择字符串的语法,所以我不能更改它。它由“,”分隔,这很好,当它们在括号内时除外,它需要忽略括号内的内容,在这种情况下,它需要在括号后拆分。这里有一个例子 String: "h5, h7, (h5, h7, r3)7, h9" 字符串:“h5,h7,(h5,h7,r3)7,h9” 它需要转换成一个字符串数组 array( "h5", "h7", "(h5, h7, r3)7", "h9" ); 排列( “h5”, “h7”, “(h5、h7、r3)7”, “h9” ); 我知道可能有一种方法可以用正则表达式来实现,我有一个非常基本的正则表达式知识,但我无法理解。如果有用的话,这里是我的js代码拆分字符串的最佳方法是什么(对于复杂的正则表达式可能)?(javascript/jquery),javascript,jquery,regex,split,Javascript,Jquery,Regex,Split,我正在创建一个递归js函数,它基本上解析字符串。我不能选择字符串的语法,所以我不能更改它。它由“,”分隔,这很好,当它们在括号内时除外,它需要忽略括号内的内容,在这种情况下,它需要在括号后拆分。这里有一个例子 String: "h5, h7, (h5, h7, r3)7, h9" 字符串:“h5,h7,(h5,h7,r3)7,h9” 它需要转换成一个字符串数组 array( "h5", "h7", "(h5, h7, r3)7", "h9" ); 排列( “h5”, “h7”, “(h5、h7
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
cols=pattern.split(',');//这就是正则表达式要去的地方。
$.each(cols,函数(索引,val){
val=$.trim(val);
var type=“”;
var-ctr=0;
对于(ctr=0;ctr0;i++){
如果(val[i]==”){
开放--;
}
其他的
substr+=val[i];
}
var中继器=val.substr(i);
if(数字(中继器)){
对于(j=0;j
显然还有很多代码,但这是相关的部分
很抱歉,如果格式设置错误,这是我的第一个问题。诀窍是,您不想使用
split()
来执行此操作-相反,您只想多次匹配正则表达式。类似于以下正则表达式的操作可以:
/\([^)]+\)|[^,]+/
(将一对括号与中间的任何内容匹配,或将不包含逗号的内容匹配。)
如果不是逗号,您可以使用
.split(',')
函数。我想分隔符不应该出现在字符串中,但如果您无法控制,则可以使用以下方法:
[^,]*\([^\)]*\)[^,]*|[^,]+
它匹配括号中的任何内容(括号周围可以有非逗号字符)或一组连续的非逗号字符。它将只匹配由逗号分隔的内容,而不匹配逗号本身。以下是一些蛮力方法: 方法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"]
var data=“h5,h7,(h5,h7,r3)7,h9”;
var temp=data.replace(/\([^)]+\)/,函数(匹配){
返回(匹配.替换(/,/g,“xx!xx”));
});
var splitData=temp.split(/\s*,\s*/);
对于(变量i=0;i
方法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"]
var data=“h5,h7,(h5,h7,r3)7,h9”;
var splitData=data.split(“,”);
var输出=[],片段,inParen=false;
对于(变量i=0;i
您可以在这里看到这两项工作:您可以尝试使用特殊的|正常顺序进行交替,其中您首先尝试匹配复杂的插入子字符串,否则将匹配正常:
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+
(字母数字)支持:[^,]
(非逗号)如果你想练习正则表达式,我建议你选择:)哇,太快了,谢谢。你有没有可能解释或链接到一个教程,展示你将如何做这样的事情。我基本上是javascript正则表达式的新手。我会使用哪个函数?谢谢,这让我陷入了一个无休止的循环,虽然不知怎的,可能是一个for循环,并在字符串长度处终止它?而且,正则表达式没有似乎有效。我在这里测试它编辑:它有效。我的错误,复制粘贴错误。这是获得投票,但它似乎不起作用。当括号末尾有一个数字时,它不起作用。不过谢谢!我得到了。啊,是的,我没有注意到那个数字隐藏在那里。还进行了编辑以使用更好的/g
regex、 split()。
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);