Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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字符串以连字符开头,则计数出现次数_Javascript_Arrays_Regex - Fatal编程技术网

如果JavaScript字符串以连字符开头,则计数出现次数

如果JavaScript字符串以连字符开头,则计数出现次数,javascript,arrays,regex,Javascript,Arrays,Regex,基本上我有一个字符串数组,如下所示: var array = [ 'Top level', '- Sub item', '-- Child of sub', 'Another top', 'Yet another top', '- Child', ]; if (string.substring(0, 1) == "-") { // ... } else if (string.substring(0, 2) == "--") { /

基本上我有一个字符串数组,如下所示:

var array = [
    'Top level',
    '- Sub item',
    '-- Child of sub',
    'Another top',
    'Yet another top',
    '- Child',
];
if (string.substring(0, 1) == "-") {
    // ...
} else if (string.substring(0, 2) == "--") {
    // ...
} else if (string.substring(0, 3) == "---") {
    // ...
}
我尝试循环每个字符串并检查字符串是否以连字符开头,如果是,请计算次数,然后删除

我可以这样做:

var array = [
    'Top level',
    '- Sub item',
    '-- Child of sub',
    'Another top',
    'Yet another top',
    '- Child',
];
if (string.substring(0, 1) == "-") {
    // ...
} else if (string.substring(0, 2) == "--") {
    // ...
} else if (string.substring(0, 3) == "---") {
    // ...
}
我还没有测试过,但你可以理解

我希望有一个更简单的解决方案也许用正则表达式?有什么帮助吗

谢谢

--编辑--

我需要计算并删除每个字符串中的连字符,因为我有一个文本区域供用户输入带有新行和连字符的字符串

文本区域值:

Top level
- Sub item
-- Child of sub
Another top
Yet another top
- Child
然后将textarea值分解为一个数组:

var array = textareaValue.split('\n');

for (var i = 0; i < array.length; i++) {
    var this = array[i];
    // Now check for hyphens and count how many
    // if (hyphens === '-')
    // else if (hyphens === '--') ...etc
};
var array=textareaValue.split('\n');
对于(var i=0;i
假设您已经在循环获取“string”(我在下面使用了“val”来消除可能与其他语言中的“string”类型混淆)

编辑:已测试,在此用法中不需要转义“-”

说明:

  • .replace是所有字符串的方法
  • 使用//允许使用正则表达式
  • ^起跑线
  • “-”文字
  • “+”一个或多个
更新:要获取计数,您可以执行以下操作:

var matches = val.match("^(-+).*");
length = matches == null ? 0 : matches[1].length;
  • match是所有字符串的方法
  • “^”比赛开始
  • “(“”)”应用在第二个匹配值中返回的组,即[1]
  • ?:之所以使用,是因为如果没有匹配项,则匹配项将为空
更新以匹配问题的编辑:

var array = textareaValue.split('\n');

for (var i = 0; i < array.length; i++) {
    var thisValue = array[i];
    // Now check for hyphens and count how many
    var matches = thisValue.match("^(-+).*");
    var hyphenCount = matches == null ? 0 : matches[1].length;
    var fixedValue = thisValue.replace(/^-+/, '')
};
var array=textareaValue.split('\n');
对于(var i=0;i
var count=[];
array=array.map(函数(str){
var match=str.match(/^(-*)?/);
count.push(匹配[1]。长度);
返回str.substr(匹配[0]。长度);
});
您可以使用正则表达式计算匹配项(即有多少连字符),然后使用相同的正则表达式匹配项替换它们


有关正则表达式和JavaScript的更多信息:

您可以简单地映射字符串,使用正则表达式匹配(并隐式计算)连字符并附加每个字符串的其余部分

var数组=[
“顶级”,
“-分项”,
“--sub的孩子”,
“另一顶”,
“又一个顶级”,
“-孩子”,
];
函数countCharacter(数据,char){
var rex=//^(-*)(.*)$//;//第一组中的连字符,第二组中的正文
返回data.map(函数(it){
var res=it.match(rex);
控制台日志(res);
返回{
计数:res[1]。长度,
正文:res[2]
};
});
}
document.getElementById('r').textContent=JSON.stringify(countCharacter(数组“-”)
另一个带有和的变体

var数组=[
“顶级”,
“-分项”,
“--sub的孩子”,
“另一顶”,
“又一个顶级”,
“-孩子”,
];    
var mapped=array.map(函数(v){
var s,vv=0;
s=v.replace(/^-+/),函数(p1){
vv=p1.1长度;
返回“”;
}) 
返回{
名称:s,计数:vv
}
});
document.getElementById('res').innerHTML=JSON.stringify(mapped,null,2)

以下是如何在单匹配调用中获得计数和替换:

for (var i = 0; i < array.length; i++) {
    var elem = array[i];
    var m = (elem.match(/^(-+)(.*)$/) || ['', elem]);
    var count = m[1].length;
    var replaced = m[2];
};
for(变量i=0;i

如果一个元素在开始时没有
-
,那么上面的代码将得到
count=0
并替换为与原始字符串相同的

然后删除什么?这不适用于所有带“-”的元素,请与第一个匹配;)抱歉,然后从字符串中删除连字符。我将编辑我的问题以包含更多信息。实际的最终结果是什么?列表还是下拉列表?这听起来像是一个X/Y问题