我正在使用 match()
和 regex
来接收所有出现的“Name”的数组。名称可以是任何字符串,在此示例中只是一个占位符。
正如您在前两次迭代中看到的那样,我收到了预期的输出。然而,第三次迭代忽略了第一个 \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>
最佳答案
你不应该在 \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);
关于javascript - .match() 和正则表达式的意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54758544/