Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正则表达式或For字符串上的循环-拆分和联接_Javascript_Regex_String_For Loop - Fatal编程技术网

Javascript 正则表达式或For字符串上的循环-拆分和联接

Javascript 正则表达式或For字符串上的循环-拆分和联接,javascript,regex,string,for-loop,Javascript,Regex,String,For Loop,我正在尝试拼凑一个正则表达式,它将接受一个具有以下格式的字符串:(个人、物品(购买、支付)、发货(地址(城市、州)),并将其转换为如下格式的字符串: person item * bought * paid shipping * address ** city ** state 到目前为止,我对正则表达式缺乏了解,这让我很难受。我开始做这样的事情。。。但这个方向行不通: var stg = "(person,item(bought,paid),shipping(address(city,stat

我正在尝试拼凑一个正则表达式,它将接受一个具有以下格式的字符串:
(个人、物品(购买、支付)、发货(地址(城市、州))
,并将其转换为如下格式的字符串:

person
item
* bought
* paid
shipping
* address
** city
** state
到目前为止,我对正则表达式缺乏了解,这让我很难受。我开始做这样的事情。。。但这个方向行不通:

var stg = "(person,item(bought,paid),shipping(address(city,state)))"
var separators = [' ', '\"\\\(', '\\\)\"', ','];
  stg = stg.split(new RegExp(separators.join('|'), 'g'));

注意:字符串可能会四处移动。我想说的是,如果出现(通过添加*开始子项)关闭子项。我想这可能更像是一个带有一堆ifs-lol的for循环。

我不知道为什么您希望将其作为多行字符串而不是JSON。。。 但你看:

var regex = /\((.*?)\,(.*?)\((.*?),(.*?)\),(.*?)\((.*?)\((.*?),(.*?)\)\)\)/;
var string = '(person,item(bought,paid),shipping(address(city,state)))';

var matches = string.match(regex)

var resultString = matches[1] + "\n";
resultString += matches[2] + "\n" ;
resultString += "* " + matches[3] + "\n" ;
resultString += "* " + matches[4] + "\n" ;
resultString += matches[5] + "\n" ;
resultString += "* " + matches[6] + "\n" ;
resultString += "** " + matches[7] + "\n" ;
resultString += "** " + matches[8];

console.log(resultString);

您可以编写自己的迭代器:

str='(个人、物品(购买、支付)、运输(地址(城市、州));
计数器=-1;
//拆分和迭代
str.split(/([(,)])/).filter(布尔值).forEach(函数(元素){
if(element.match(/^[^(,)]/){
console.log(“*”。重复(计数器)+((计数器>0)?“”:“”)+元素)
}else if(元素=='('){
计数器++;
}如果(元素=='),则为else{
计数器--;
}

});您可以使用一种独特的替换方法:

str='person,item(购买、支付)、shipping(地址(城市、州));
变量星号=“”;
var result=str.replace(/(\()\),/g,(match,openP,closingP)=>{
如果(openP){
返回'\n'+(星号+='*');
}
如果(关闭){
星号=星号。切片(1);
返回“”;
}
//其他:是逗号吗
返回“\n”+星号;
});

控制台日志(结果)您的问题不清楚。是否要将其格式化为插入了
*
字符的多行字符串?还是字符串数组?@Yathi首选添加*的多行字符串来标记子项。请注意,双**标记子对象的子对象。是否有不依赖匹配项的方法?就好像绳子在移动一样。那么更多的是注意到(从一个孩子开始到)结束?