目前,我的代码适用于包含一组括号的输入。
var re = /^.*\((.*\)).*$/;
var inPar = userIn.replace(re, '$1');
...意思是当用户输入化学式Cu(NO3)2时,警告inPar返回NO3),这就是我想要的。
但是,如果输入Cu(NO3)2(CO2)3,则仅返回CO2。
我在RegEx中不太了解,所以为什么会发生这种情况,有没有办法在发现它们后将NO3和CO2)放入数组中?
答案 0 :(得分:11)
您想使用String.match而不是String.replace。您还希望正则表达式匹配括号中的多个字符串,因此您不能拥有^(字符串的开头)和$(字符串的结尾)。在括号内匹配时我们不能贪婪,所以我们将使用。*?
逐步完成更改后,我们得到:
// Use Match
"Cu(NO3)2(CO2)3".match(/^.*\((.*\)).*$/);
["Cu(NO3)2(CO2)3", "CO2)"]
// Lets stop including the ) in our match
"Cu(NO3)2(CO2)3".match(/^.*\((.*)\).*$/);
["Cu(NO3)2(CO2)3", "CO2"]
// Instead of matching the entire string, lets search for just what we want
"Cu(NO3)2(CO2)3".match(/\((.*)\)/);
["(NO3)2(CO2)", "NO3)2(CO2"]
// Oops, we're being a bit too greedy, and capturing everything in a single match
"Cu(NO3)2(CO2)3".match(/\((.*?)\)/);
["(NO3)", "NO3"]
// Looks like we're only searching for a single result. Lets add the Global flag
"Cu(NO3)2(CO2)3".match(/\((.*?)\)/g);
["(NO3)", "(CO2)"]
// Global captures the entire match, and ignore our capture groups, so lets remove them
"Cu(NO3)2(CO2)3".match(/\(.*?\)/g);
["(NO3)", "(CO2)"]
// Now to remove the parentheses. We can use Array.prototype.map for that!
var elements = "Cu(NO3)2(CO2)3".match(/\(.*?\)/g);
elements = elements.map(function(match) { return match.slice(1, -1); })
["NO3", "CO2"]
// And if you want the closing parenthesis as Fabrício Matté mentioned
var elements = "Cu(NO3)2(CO2)3".match(/\(.*?\)/g);
elements = elements.map(function(match) { return match.substr(1); })
["NO3)", "CO2)"]
答案 1 :(得分:3)
你的正则表达式有锚点来匹配字符串的开头和结尾,所以它不足以匹配多次出现。使用String.match
使用RegExp g
标志(全局修饰符)更新了代码:
var userIn = 'Cu(NO3)2(CO2)3';
var inPar = userIn.match(/\([^)]*\)/g).map(function(s){ return s.substr(1); });
inPar; //["NO3)", "CO2)"]
如果您需要旧的IE支持:Array.prototype.map
polyfill
或没有polyfills:
var userIn = 'Cu(NO3)2(CO2)3';
var inPar = [];
userIn.replace(/\(([^)]*\))/g, function(s, m) { inPar.push(m); });
inPar; //["NO3)", "CO2)"]
以上匹配(
并捕获零个或多个非)
个字符的序列,然后是)
并将其推送到inPar
数组。
第一个正则表达式基本上相同,但使用整个匹配,包括开始(
括号(稍后通过映射数组删除)而不是捕获组。
从问题我假设结束)
括号应该在结果字符串中,否则这里是没有右括号的更新解决方案:
对于第一个解决方案(使用s.slice(1, -1)
):
var inPar = userIn.match(/\([^)]*\)/g).map(function(s){ return s.slice(1, -1);});
对于第二个解决方案(捕获组之外的\)
):
userIn.replace(/\(([^)]*)\)/g, function(s, m) { inPar.push(m); });
答案 2 :(得分:0)
您可以尝试以下方法:
"Cu(NO3)2".match(/(\S\S\d)/gi) // returns NO3
"Cu(NO3)2(CO2)3".match(/(\S\S\d)/gi) // returns NO3 CO2