.match()和regex的意外输出

时间:2019-02-19 03:43:42

标签: javascript jquery regex

我正在使用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 个答案:

答案 0 :(得分:2)

您不应该在\n上进行匹配,因为不能保证它在那里(例如,Name:...恰好是文本的第一行)。而是使用m(多行)标志,其中^与行的开头相匹配,但是确实如此。同样,您可以使用?“ non-greedy”修饰符来确保您不跨越冒号,这使得使用.(与换行符不匹配)变得容易,从而避免了明确防范他们。最终结果:

/^.*?:/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);

答案 1 :(得分:1)

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

  

currentVal.match(/ \ n [^:\ n] +:/ g);

请注意,此/\n[^:]+:/g将捕获\n:之间不包含:字符的所有字符,因此此模式\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>