【问题标题】:if JavaScript string starts with hyphen then count occurrences如果 JavaScript 字符串以连字符开头,则计算出现次数
【发布时间】:2015-06-02 13:56:00
【问题描述】:

基本上我有一个这样的字符串数组:

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
};

【问题讨论】:

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

标签: javascript arrays regex


【解决方案1】:

假设您已经在循环获取“字符串”(我在下面使用了“val”来消除可能与其他语言中的“字符串”类型的混淆)

val = val.replace(/^-+/, '')

编辑:经过测试,在此用法中无需转义“-”

解释:

  • .replace 是所有字符串的方法
  • 使用 // 允许正则表达式
  • ^ 行首
  • '-' 字面量
  • '+'一个或多个

更新:要包括获取计数,您可以这样做:

var matches = val.match("^(-+).*");
length = matches == null ? 0 : matches[1].length;
  • match是所有字符串的方法
  • '^' 匹配开始
  • '(' ')' 应用组,在matches的第二个值中返回,即[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(/^-+/, '')
};

【讨论】:

    【解决方案2】:

    您可以使用正则表达式计算匹配项(即有多少连字符),然后使用相同的 RegEx 匹配项替换它们。

    更多关于正则表达式和 JavaScript 的信息:http://www.w3schools.com/js/js_regexp.asp

    【讨论】:

      【解决方案3】:
      var count = [];
      array = array.map(function(str) {
          var match = str.match(/^(-*) ?/);
          count.push(match[1].length);
          return str.substr(match[0].length);
      });
      

      【讨论】:

        【解决方案4】:

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

        var array = [
          'Top level',
          '- Sub item',
          '-- Child of sub',
          'Another top',
          'Yet another top',
          '- Child',
        ];
        
        function countCharacter(data, char) {
          var rex = /^(-*)(.*)$/; // hyphens in first group, body in second
          return data.map(function(it) {
            var res = it.match(rex);
            console.log(res);
            return {
              count: res[1].length,
              text: res[2]
            };
          });
        }
        
        document.getElementById('r').textContent = JSON.stringify(countCharacter(array, '-'));
        &lt;pre id=r&gt;&lt;/pre&gt;

        【讨论】:

          【解决方案5】:

          mapreplace with function 的另一个变体

          array.map(function(v){
              var s,vv=0;
              s = v.replace(/^-+/,function(p1){
               vv = p1.length;
               return '';
          }) 
              return {
                  s:s, v:vv
              }
          });
          

          var array = [
              'Top level',
              '- Sub item',
              '-- Child of sub',
              'Another top',
              'Yet another top',
              '- Child',
          ];    
          var mapped = array.map(function(v){
                  var s,vv=0;
                  s = v.replace(/^-+/,function(p1){
                   vv = p1.length;
                   return '';
              }) 
                  return {
                      name:s, count:vv
                  }
              });
            
            document.getElementById('res').innerHTML = JSON.stringify(mapped, null,2);
          &lt;pre id='res'&gt;&lt;/pre&gt;

          【讨论】:

            【解决方案6】:

            以下是在单匹配调用中获取计数和替换的方法:

            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];
            };
            

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

            【讨论】:

              猜你喜欢
              • 2010-10-27
              • 1970-01-01
              • 2014-04-24
              • 2012-10-03
              • 2021-11-18
              • 2021-01-27
              • 1970-01-01
              • 2010-09-21
              相关资源
              最近更新 更多