Javascript 正则表达式查找不完整的圆括号
我需要一个正则表达式,可以检测不完整的圆括号。 我试过这个<代码>/^(?:(?!\(.*))/ 我的测试字符串是thisJavascript 正则表达式查找不完整的圆括号,javascript,regex,Javascript,Regex,我需要一个正则表达式,可以检测不完整的圆括号。 我试过这个/^(?:(?!\(.*))/ 我的测试字符串是this(sample),然后该正则表达式检测不完整的括号,即返回resulttrue。但是,如果我的测试字符串是this(sample)(另一个),则返回false 我必须找到一个否定的模式,因为如果我试图寻找简单的/\(*\)/,那么它将检测到第一个完整的括号并返回。现在,即使尝试了否定的前瞻,它也失败了。请帮助我,我哪里出了问题 好的,那个测试字符串太蠢了。这是我实际想要实现的。用户将
(sample
),然后该正则表达式检测不完整的括号,即返回resulttrue
。但是,如果我的测试字符串是this(sample)(另一个
),则返回false
我必须找到一个否定的模式,因为如果我试图寻找简单的/\(*\)/
,那么它将检测到第一个完整的括号并返回。现在,即使尝试了否定的前瞻,它也失败了。请帮助我,我哪里出了问题
好的,那个测试字符串太蠢了。这是我实际想要实现的。用户将输入一个自然查询,如((a和B)或(C和D))或E。这将用于对规则集进行分组。两件事:
这可能是一个随便的回答,我认为这可能取决于预期的输入类型
\([^\)]*$
它将查找任何一个“(”,在它和文件/行结尾之间没有“)”的实例。因此,如果返回true,您可以将用户指向匹配的索引。如果您的括号格式不支持嵌套(正如stema所说,如果您仅用正则表达式处理它,则不应该这样做)然后你可以对开括号做一些类似的事情。我会把它放在我的示例中,但出于某种原因,“EOF”或(“在regexpal.com上内存不足…)这可能是一个即兴回答,我想这可能取决于预期的输入类型
\([^\)]*$
它将查找任何一个“(”,在它和文件/行结尾之间没有“)”的实例。因此,如果返回true,您可以将用户指向匹配的索引。如果您的括号格式不支持嵌套(正如stema所说,如果您仅用正则表达式处理它,则不应该这样做)然后你可以对开括号做类似的事情。我会把它放在我的示例中,但出于某种原因,“EOF”或(“was failing my memory on regexpal.com…)的语法根据,您无法确定括号是否仅通过正则表达式匹配。这里有其他答案,可以通过各种其他方式解决问题(即不完全依赖正则表达式).根据,您无法确定括号是否仅通过正则表达式匹配。其他答案可通过各种其他方式解决问题(即不完全依赖正则表达式).正如前面提到的其他答案一样,递归正则表达式在javascript中是不可能的。下面是一个函数,它返回
true
,如果字符串有正确的括号对,或者返回出现问题的字符索引
var nested_brackets = function (test) {
var left = '(', right = ')';
var i = 0, n = test.length, tally = 0;
while (i < n) {
if (test[i] == left) ++tally;
else if (test[i] == right) --tally;
if (tally < 0) break;
++i;
}
return (i == n && tally == 0) || i;
}
正如前面提到的其他答案一样,递归正则表达式在javascript中是不可能的。下面是一个函数,它返回
true
(如果字符串有正确的括号对),或者返回出现问题的字符索引
var nested_brackets = function (test) {
var left = '(', right = ')';
var i = 0, n = test.length, tally = 0;
while (i < n) {
if (test[i] == left) ++tally;
else if (test[i] == right) --tally;
if (tally < 0) break;
++i;
}
return (i == n && tally == 0) || i;
}
这里有一个使用正则表达式(和嵌套括号问题)的替代方法,方法是@,但函数返回
true
或false
,并接受可选参数,以便您可以测试say{
和}
Javascript
function testParenthesisPairs(string /*, openChar, closeChar */ ) {
var length = string.length,
i = 0,
count = 0,
openChar = arguments[1] || "(",
closeChar = arguments[2] || ")";
while (i < length) {
char = string.charAt(i);
if (char === openChar) {
count += 1;
} else if (char === closeChar) {
count -= 1;
}
if (count < 0) {
return false;
}
i += 1;
}
return count === 0;
}
console.log(testParenthesisPairs("()()()()"));
console.log(testParenthesisPairs("()()()()", "(", ")"));
console.log(testParenthesisPairs("()()()("));
console.log(testParenthesisPairs(")()()()"));
console.log(testParenthesisPairs(")(()()()"));
函数test括号ispairs(string/*、openChar、closeChar*/){
var length=string.length,
i=0,
计数=0,
openChar=参数[1]| |“(“,
closeChar=参数[2]| |“)”;
while(i
输出
真的
真的
假的
假的
假的
在
更新:也类似于注释中由@指出的由@。这里有一个替代使用正则表达式(和嵌套括号问题)的方法,由@,但函数返回
true
或false
,并接受可选参数,以便您可以测试{
和
Javascript
function testParenthesisPairs(string /*, openChar, closeChar */ ) {
var length = string.length,
i = 0,
count = 0,
openChar = arguments[1] || "(",
closeChar = arguments[2] || ")";
while (i < length) {
char = string.charAt(i);
if (char === openChar) {
count += 1;
} else if (char === closeChar) {
count -= 1;
}
if (count < 0) {
return false;
}
i += 1;
}
return count === 0;
}
console.log(testParenthesisPairs("()()()()"));
console.log(testParenthesisPairs("()()()()", "(", ")"));
console.log(testParenthesisPairs("()()()("));
console.log(testParenthesisPairs(")()()()"));
console.log(testParenthesisPairs(")(()()()"));
函数test括号ispairs(string/*、openChar、closeChar*/){
var length=string.length,
i=0,
计数=0,
openChar=参数[1]| |“(“,
closeChar=参数[2]| |“)”;
while(i