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

标签 javascript jquery regex

我正在使用 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/

相关文章:

Javascript获取所有下拉菜单的值

javascript - 如果捕获组等于 replace() 中的某些内容,我如何检查正则表达式替换?

php - 在 PHP 中将 POSIX 模式转换为 PCRE(eregi 到 preg_match)

javascript - 如何检测 Javascript 游戏中的方向键?

javascript - 从 Javascript-Object 生成表单

javascript - 数据表中数组变量的粒度操作

javascript - Yii2 通过点击链接加载模态

javascript - 如何在 "className"之外启用顺风智能感知?

javascript - 如何访问函数内部的函数

javascript - 正则表达式:允许用 ; 分隔多封电子邮件(分号)AND 允许空白/空值