考虑这些句子:
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/