意外输出.match()和正则表达式

问题描述 投票:1回答:2

我正在使用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>
javascript jquery regex
2个回答
1
投票

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

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

请注意,这个/\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>

2
投票

你不应该匹配\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);

要捕获前结肠和后结肠值:

qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.