javascript - 匹配这个字符串的正则表达式是什么?

标签 javascript regex

考虑这些句子:

apple is 2kg
apple banana mango is 2kg
apple apple apple is 6kg
banana banana banana is 6kg

鉴于“苹果”、“香蕉”和“芒果”是唯一的水果,提取出现在句子开头的水果名称的正则表达式是什么?

我写了这个正则表达式(https://regex101.com/r/fY8bK1/1):

^(apple|mango|banana) is (\d+)kg$  

但这仅在句子中有单个水果时才匹配。

如何提取所有水果名称?

所有 4 个句子的预期输出应该是:

apple, 2
apple banana mango, 2
apple apple apple, 6
banana banana banana, 6

最佳答案

您可以像这样使用分组:

^((?:apple|mango|banana)(?:\s+(?:apple|mango|banana))*) is (\d+)kg$

参见 regex demo

(?:...) 是捕获 ((...)) 组中的非捕获组,以免造成困惑输出。

((?:apple|mango|banana)(?:\s+(?:apple|mango|banana))*) 组匹配:

  • (?:apple|mango|banana) - 替代列表中的任何值,用替代 | 运算符分隔。如果您打算只匹配整个单词,请将 \b 放在子模式的两端。
  • (?:\s+(?:apple|mango|banana))* 匹配 0 个或多个序列...
    • \s+ - 1 个或多个空格
    • (?:apple|mango|banana) - 任何替代方案。

片段:

var re = /^((?:apple|mango|banana)(?:\s+(?:apple|mango|banana))*) is (\d+)kg$/gm; 
var str = 'apple is 2kg\napple banana mango is 2kg\napple apple apple is 6kg\nbanana banana banana is 6kg';
var m;
 
while ((m = re.exec(str)) !== null) {
    document.write(m[1] + "," + m[2] + "<br/>");
}

document.write("<b>appleapple is 2kg</b> matched: " + 
     /^((?:apple|mango|banana)(?:\s+(?:apple|mango|banana))*) is (\d+)kg$/.test("appleapple is 2kg"));

关于javascript - 匹配这个字符串的正则表达式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33320518/

相关文章:

regex - 我如何重复正则表达式

regex - linux通过sed截取正则表达式模式

javascript - 当卸载/重用 React 组件时,如何取消 Promise 中的下一个 'then'?

javascript - native 对象的怪异行为是由什么引起的?

JavaScript 和 WordPress(尝试了 2 种解决方案)

javascript - jQuery 目标 next() html 项目

java - 给定一个命令 - 使用正则表达式调用 java/groovy 中的方法

regex - Scala 正则表达式无法运行

javascript - Discord bot 错误 - SequelizeDatabaseError : SQLITE_ERROR: no such table: users

javascript - 输入模式匹配