代码之家  ›  专栏  ›  技术社区  ›  KHansen

.match()和regex的意外输出

  •  1
  • KHansen  · 技术社区  · 6 年前

    我正在使用 match() regex

    正如您在前两次迭代中看到的,我收到了预期的输出。然而,第三次迭代忽略了第一次迭代 \n 并且还输出前一行。

    你知道为什么会这样吗?

    $("#shortDescTextarea").on('keyup', function() {
      var currentVal = $(this).val();
      var allItemNames = currentVal.match(/\n[^:]+:/g);
    
      console.log(allItemNames);
    
    });
    textarea{height:250px;width:500px;}
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <textarea id="shortDescTextarea" class="form-control">|H|Header|/H|
    Name: Value
    Name: Value
    |H|Header|/H|
    Name:
    </textarea>
    2 回复  |  直到 6 年前
        1
  •  2
  •   Amadan    6 年前

    你不应该在比赛中获胜 \n ,因为不保证在那里(例如,如果 Name:... 恰好是您的文本的第一行)。相反,使用 m (多行)标志,其中 ^ 匹配行的开头,不管它是什么。同样,您可以使用 ? . ,它不匹配换行符,避免了显式地防范它们。最终结果:

    /^.*?:/gm
    

    要捕获冒号前和冒号后的值,请执行以下操作:

    let str = `
    Name: Foo
    Name: Bar
    Header stuff I don't understand
    Name: Quux
    `;
    let re = /^(.*?):\s*(.*)$/gm
    results = [];
    while (m = re.exec(str)) {
      results.push([m[1], m[2]]);
    }
    console.log(results);
        2
  •  1
  •   Shidersz    6 年前

    解决此问题的一种方法是添加 \n 在括号内,如下所示:

    请注意 /\n[^:]+:/g 将捕获 : 这不包括 char,所以这个模式 \n|H|Header|/H|\nName: 将被抓获。

    $("#shortDescTextarea").on('keyup', function()
    {
        var currentVal = $(this).val();
        var allItemNames = currentVal.match(/\n[^:\n]+:/g);
        console.log(allItemNames);
    });
    textarea{height:250px;width:500px;}
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <textarea id="shortDescTextarea" class="form-control">|H|Header|/H|
    Name: Value
    Name: Value
    |H|Header|/H|
    Name:
    </textarea>