【问题标题】:Find lines not matching string in JavaScript在 JavaScript 中查找与字符串不匹配的行
【发布时间】:2013-02-19 00:26:14
【问题描述】:

我只需要找到不匹配字符串的第一行 - 这可能比找到所有字符串更容易。到目前为止,我发现的唯一解决方案是删除包含字符串的行,然后我选择其余的行。

例如,在下面的文本中,我需要找到不包含字符串 "line" 的行 - 那将是第四行:Lazy Bear

第一行
二线
三线
懒熊

最简单的测试方法是在书签中,所以它是:

var myText = "First line" + "\n";
var myText = myText + "Second line" + "\n";
var myText = myText + "Third line" + "\n";
var myText = myText + "Lazy Bear" + "\n";

var p = prompt("My Text = ", myText);

var x = myText.replace(/.*line.*/g, "");
var x = x.replace(/\n/g, "");
var p = prompt("Result:", x);

注意事项:

  1. “提示”行仅用于调试目的

  2. 如果我在 Bookmarklets 中只使用“myvar=..”而不是“var myvar=..”,它将修改当前页面,打印变量。 )

【问题讨论】:

    标签: javascript regex match


    【解决方案1】:

    正则表达式/^(?!.*line).*$/m 匹配不包含模式“line”的行。

    如果没有这样的行,则以下代码返回null,否则返回第一行:

    myText.match(/^(?!.*line).*$/m);
    

    完整的代码如下所示:

    var x = (myText.match(/^(?!.*line).*$/m)||['no result found'])[0];
    

    【讨论】:

    • 效果很好!顺便说一句,为什么它需要“\n”?
    • 它在结果的开头添加了一个“\n”(在结果上尝试一个“escape()”来查看它),是否可以在同一行中修复它?跨度>
    • 如果第一行是您需要的,它不会找到它。第一行必须以“\n”开头才能被找到。但仍然是迄今为止最好的解决方案..
    • 您不需要在结果中包含行分隔符。只需在多行模式下使用起始锚点:/^(?!.*line).*$/m
    • 我必须承认我并不完全理解多行模式,但它真的很棒!
    【解决方案2】:

    因为没有一个答案提到这个:

    str.match(/^(?!.*line).*$/gm);
    

    m 标志使^$ 匹配一行的开头和结尾,而不是整个字符串。

    由于. 不匹配换行符,否定的前瞻包含在同一行中。

    请注意,如果字符串以\n 结尾,则结果中的最后一个元素将是一个空字符串,这是完全正常的,因为该空字符串是单独的一行。如果您只想捕获非空字符串(即使在输入字符串的中间),那么您可以对正则表达式进行一些小改动:

    str.match(/^(?!.*line).+$/gm);
    

    * 更改为+ 强制正则表达式匹配非空行。

    【讨论】:

      【解决方案3】:

      我跳过了提示内容,因为我不确定你在做什么。

      var myText = "First line" + "\n";
      var myText = myText + "Second line" + "\n";
      var myText = myText + "Third line" + "\n";
      var myText = myText + "Lazy Bear" + "\n";
      var myTextAsArrayOfLines = myText.split("\n");
      for(var i = 0; i < myTextAsArrayOfLines.length; i++)
      {
        if(myTextAsArrayOfLines[i].indexOf("line") === -1)
        {
          window.alert("The first line that didn't contain 'line' was " + ((i + 1) + '');
          //end looping
          i = i.length;
        }
      }
      

      【讨论】:

        【解决方案4】:
        var myText = "First line" + "\n";
        var myText = myText + "Second line" + "\n";
        var myText = myText + "Third line" + "\n";
        var myText = myText + "Lazy Bear" + "\n";
        var p = prompt("My Text = ", myText);
        
        var lines = myText.split("\n"), result; // split the text into an array to loop through it
        
        for(var i = 0, len = lines.length; i < len; i++) {
            if(lines[i].indexOf("line") < 0) { // if we find a line that doesn't match
                result = lines[i];
                break; // if we find a result break the loop
            }
        }
        
        console.log("Result: " + result); // log the line containing the result
        

        【讨论】:

          【解决方案5】:

          您可以通过\n 拆分行,然后使用数组.filter 方法仅获取不匹配的行:

          myText.split("\n").filter(function (elem) {
              return elem.indexOf(p) === -1;
          });
          

          http://jsfiddle.net/ExplosionPIlls/S7B5f/1/

          【讨论】:

            猜你喜欢
            • 2017-04-08
            • 2015-02-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-23
            相关资源
            最近更新 更多