意外输出.match()和正则表达式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了意外输出.match()和正则表达式相关的知识,希望对你有一定的参考价值。
我正在使用match()
和regex
来接收所有出现的“名称”的数组。名称可以是任何字符串,只是此示例的占位符。
正如您在前两次迭代中所看到的,我收到了预期的输出。然而,第三次迭代忽略了第一个
并输出了前一行。
任何想法为什么会这样?
$("#shortDescTextarea").on('keyup', function() {
var currentVal = $(this).val();
var allItemNames = currentVal.match(/
[^:]+:/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>
答案
解决这个问题的一种方法是在括号内添加
,如下所示:
currentVal.match(/ n [^: N] +:/克);
请注意,这个/
[^:]+:/g
将捕获不包含
字符的:
和:
之间的所有字符,因此将捕获此模式
|H|Header|/H|
Name:
。
例:
$("#shortDescTextarea").on('keyup', function()
{
var currentVal = $(this).val();
var allItemNames = currentVal.match(/
[^:
]+:/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>
另一答案
你不应该匹配
,因为它不能保证在那里(例如,如果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);
要捕获前结肠和后结肠值: