我需要一个可以检测不完整圆括号的正则表达式。
我试过这个。 /^(?:(?!\(.*\)))/
我的测试字符串是(sample
,然后这个正则表达式检测到不完整的括号,即返回结果true
。但是,如果我的测试字符串是(sample) (another
。然后它返回false。
我必须找到一个否定的模式,因为如果我试图寻找简单的/\(*\)/
,那么它将检测第一个完整的括号并返回。现在即使在尝试消极前瞻之后,它仍然失败了。请帮我告诉我哪里出错了。
P.S。好吧,测试字符串太愚蠢了。这就是我实际想要实现的目标。用户将输入自然查询,如((A和B)或(C和D))或E.这将用于对一组规则进行分组。
答案 0 :(得分:3)
两件事:
您通过锚^
将表达式绑定到字符串的开头,因此它只匹配字符串开头的左括号(当它找到另一个结束括号时将失败) 。)
如果您的括号是嵌套的,则无法使用JavaScript正则表达式。 (如果它们没有嵌套,则可以完成)
< / LI> 醇>答案 1 :(得分:1)
根据this answer,您无法确定括号是否仅通过正则表达式匹配。其他答案可以用其他各种方式解决问题(即不依赖于正则表达式)。
答案 2 :(得分:1)
正如其他已经提到的答案,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;
}
一些例子
nested_brackets("(A and (B or C))"); // returns true
nested_brackets("(A) and (B)"); // returns true
nested_brackets("(A and (B or C)"); // returns 15
nested_brackets("(A and B)) or C)"); // returns 9
答案 3 :(得分:1)
以下是使用@ similar to this answer的正则表达式(和嵌套括号问题),kmoerman的替代方法,但该函数返回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(")(()()()"));
输出
真 真正 假 假 假的
上更新:与@ this answer中的Damask类似,正如评论中@ Jon指出的那样。
答案 4 :(得分:0)
这可能是一个随意的答案,我认为这可能取决于预期的输入类型......
\([^\)]*$
那个人会在它和文件/行的末尾之间寻找“(”,它没有“)”的任何实例。因此,如果返回true,则可以将用户指向匹配的索引。如果你的括号格式不支持嵌套(正如stema所说,如果你试图用正则表达式处理它,它应该不)那么你可以做一些类似的开放式括号。我会把它放在我的样本中,但出于某种原因,“EOF 或(”的语法在regexpal.com上失败了我的记忆......)