2017-02-22 69 views
1

我需要創建的正則表達式規則與犯規匹配字符串」包含有他們內部,而是一直處於關閉狀態(但沒有嵌套()字符,並且同樣的字符串正則表達式匹配字符串。另一件事,空()也是錯誤的用含有封閉括號

良好的字符串(應選配):

aaaaaa 
(asdasd) 
aaaa(bbb)a 
(aaa)aaaa 
aaaaaa(aaaa) 
aaaa(bbb)(ccc)ddd 
aaaa(bbbb)cccc(dddd)eeee 

壞字符串(不應該有比賽):

)aaaa 
)aaaa(asd) 
aaaaaa(
aaaa(bbb)) 
aaa(bbb 
aaaaa((bbbb)cccc 
aaaa(bbbb))ccc 
aaaa(aasd(adssad))ad 
adassd(aas(add)adsa(asda)ad) 
() 

試過並創建了這樣的東西(?!.*[(]{2,})(?!.*[)]{2,})(?![)])(?!.*[(]$).*$,但它仍然不好。任何幫助?

+1

多少級可以有?這是一個好串還是壞串:'aaa(bb(cc)bb)'? –

+0

圓括號的一個級別是可以實現的。固定數量的水平是可以實現的,但不是實用的,只有幾個水平。任意嵌套不再是一種常規語言。 – 9000

回答

3

您可以使用此正則表達式爲你的工作:

/^(?!$)(?:[^)(]*\([^()]+\))*[^)(]*$/gm 

RegEx Demo

正則表達式破碎:

  • ^ - 行啓動
  • (?!$) - 負前瞻,以確保我們不匹配emp TY串
  • (?: - 開始非捕獲組
    • [^)(]*的 - 匹配0個或更多的什麼,但()
    • \( - 匹配一個(
    • [^()]+ - 第1場或更多的東西但是()
    • \) - 匹配文字)
  • )* - 非捕獲組的結束,*使得它匹配0或多次
  • [^)(]* - 匹配0個或更多的什麼,但()
  • $ - 行結束
+0

不必要的複雜和冗長,不需要匹配'[^)(]'兩次。 – georg

+0

@georg:它可能看起來比較長,但會比'^([^()] | \([^()]你可能想用'「))來檢查你的函數)x)(((」'))+ $'(你可以檢查在regex101上採取的步驟# – anubhava

2

如果你想檢查平衡的parens,你可以使用這樣的功能:

function balanced(str) { 
 
    var a = 0; 
 
    for(var i = 0; i < str.length; i++) { // for each character in str 
 
    if(str.charAt(i) == '(') a++;  // if it's an open paren, increment a 
 
    else if(str.charAt(i) == ')') a--; // if it's a close one, decrement a 
 
    } 
 
    return a == 0;       // if a == 0 then it's balanced (true), if not then it's not balanced (false) 
 
} 
 

 
var s1 = "aaaa(bbbb)cccc(dddd)eeee"; 
 
var s2 = "aaaa(bbbb(cccc(dddd)eeee"; 
 
var s3 = "aaaa"; 
 

 
console.log(s1 + " => " + balanced(s1)); 
 
console.log(s2 + " => " + balanced(s2)); 
 
console.log(s3 + " => " + balanced(s3));

或者,如果你堅持使用正則表達式,然後使用兩個正則表達式來檢查平衡的括號是這樣的:

function balanced(str) { 
 
    var opened = str.match(/\(/g);  // match open parens 
 
    var closed = str.match(/\)/g);  // match close parens 
 
    opened = opened? opened.length: 0; // get the count of opened parens, if nothing is matched then 0 
 
    closed = closed? closed.length: 0; // get the count of closed parens, if nothing is matched then 0 
 
    return opened == closed;   // balanced means the count of both is equal 
 
} 
 

 
var s1 = "aaaa(bbbb)cccc(dddd)eeee"; 
 
var s2 = "aaaa(bbbb(cccc(dddd)eeee"; 
 
var s3 = "aaaa"; 
 

 
console.log(s1 + " => " + balanced(s1)); 
 
console.log(s2 + " => " + balanced(s2)); 
 
console.log(s3 + " => " + balanced(s3));

+1

) – georg

0

這應該做的伎倆:

^([^()]|\([^()]+\))+$ 

閱讀「ma tch不是paren或(這裏沒有parens),一次或多次,整個字符串「

如果你想在任何級別匹配平衡的parens,由於缺乏遞歸支持,單個表達式在js中是不可能的,但一個函數將是相當微不足道的。

let balanced = function(s) { 
 
    var re = /\([^()]*\)/g 
 
    while (s.match(re)) s = s.replace(re, '') 
 
    return !s.match(/[()]/) 
 
} 
 

 
console.log(balanced('a(b((d))e) (f) g')) 
 
console.log(balanced('a(b((d))e? (f) g'))

或沒有正則表達式:

let balanced = s => { 
 

 
    let c = 0; 
 

 
    for (let x of s) { 
 
     if (x == '(') c++; 
 
     if (x == ')' && !c--) return false; 
 
    } 
 

 
    return !c; 
 
};