Jetzt gibt es eine Zeichenfolge:
<code>str1 = '(subject_id = "A" OR (status_id = "Open" AND (status_id = "C" OR level_id = "D")))' </code>
oder
<code>str2 = '(subject_id = "A" OR subject_id = "Food" OR (subject_id = "C" OR (status_id = "Open" AND (status_id = "C" OR (level_id = "D" AND subject_id = "(Cat)")))))' </code>
Ich muss reguläre Regeln verwenden, um die Klammern des innersten von in der Zeichenfolge und den Inhalt darin abzugleichen (keine passenden Klammern in Anführungszeichen), das heißt:
<code>str1 => (status_id = "C" OR level_id = "D") str2 => (level_id = "D" AND subject_id = "(Cat)") </code>
Wie sollen wir also diesen superkomplexen regulären Ausdruck schreiben?
Wenn ein regulärer Ausdruck nicht implementiert werden kann, wie kann er dann mit JS implementiert werden?
Außerdem habe ich für str1
einen solchen regulären Ausdruck gefunden, der die Übereinstimmung erfüllen kann:
<code>\([^()]+\) </code>
Aber für str2 gibt es immer noch keine Lösung. Ich freue mich auf Ihre Antworten!
Jetzt gibt es eine Zeichenfolge:
<code>str1 = '(subject_id = "A" OR (status_id = "Open" AND (status_id = "C" OR level_id = "D")))' </code>
oder
<code>str2 = '(subject_id = "A" OR subject_id = "Food" OR (subject_id = "C" OR (status_id = "Open" AND (status_id = "C" OR (level_id = "D" AND subject_id = "(Cat)")))))' </code>
Ich muss reguläre Regeln verwenden, um die Klammern des innersten von in der Zeichenfolge und den Inhalt darin abzugleichen (keine passenden Klammern in Anführungszeichen), das heißt:
<code>str1 => (status_id = "C" OR level_id = "D") str2 => (level_id = "D" AND subject_id = "(Cat)") </code>
Wie sollen wir also diesen superkomplexen regulären Ausdruck schreiben?
Wenn ein regulärer Ausdruck nicht implementiert werden kann, wie kann er dann mit JS implementiert werden?
Außerdem habe ich für str1
einen solchen regulären Ausdruck gefunden, der die Übereinstimmung erfüllen kann:
<code>\([^()]+\) </code>
Aber für str2 gibt es immer noch keine Lösung. Ich freue mich auf Ihre Antworten!
Für str2 habe ich das gefunden
<code>\([^()]*\"[^"]*\"[^()]*\)</code>
Nachdem ich mir die Anforderungen angesehen hatte, kam mir die Verwendung regulärer Ausdrücke überhaupt nicht vor ... Verwenden wir einfach die traditionelle Methode.
Sie können die Idee der Operationspriorität verwenden , das heißt, verwenden Sie die Datenstruktur Stapel , um den Inhalt interner Klammern zu erhalten;
Technische Punkte:
entspricht der innersten Klammer
Inhalte in Anführungszeichen werden nicht als Übereinstimmungskriterien verwendet
Beginnen Sie mit dem Entwurf eines Algorithmus basierend auf dieser Idee:
Der Algorithmus berechnet die startIndex
und endIndex
der abzugleichenden Teilzeichenfolge und verwendet dann die substring()
-Methode, um die Teilzeichenfolge zu erhalten
-Zeichen übereinstimmt, wird "("
auf den Stapel verschoben. Wenn wir das erste von finden, erscheint ")"
aus dem Stapel, das heißt, der Teilstring zwischen den beiden Indizes ist der Zielstring
übereinstimmt, wird die Übereinstimmung mit """
beendet und die Suche nach "("
erst dann fortgesetzt, wenn nach dem nächsten """
gesucht wird. "("
//Auf diese Weise versuchen Sie
/(([^()]*?"[^"()]*([^"()] )[^( )]*?"[^()]*) )|([^()] )/
Anforderungen analysieren:
( a )
enthaltenen Zeichen: a
und a1
zur Darstellung von a2
Eine Zeichenfolge, die eine oder mehrere a1
-Formen enthält, b " c " b
eine Zeichenfolge b
"
ist, die (
, )
oder
eine Zeichenfolge c
"
ist, die
enthält weder a2
noch (
)
2.2 =>Dann ändern Sie es so:=
a2
[^()]*
2.1.1 => 🎜>2.1 =>
=b
=[^()"]*
1 =>c
=[^"]*
=a1
(b"c"b)
(b"c") b
Regulärer Ausdruck:([^()"]*"[^"]*") [^()"]*
(a)
Verifizierung:(a1)|(a2)
(([^()"]*"[^"]*") [^()"]*)|([^()]*)
<code>/\(([^\(\)\"]*\"[^\"]*\")+[^\(\)\"]*\)|\([^\(\)]*\)/</code>
<code class="javascript">var reg = /\(([^\(\)\"]*\"[^\"]*\")+[^\(\)\"]*\)|\([^\(\)]*\)/; '(the (quick "brown" fox "jumps over, (the) lazy" dog ))' .match(reg)[0] //"(quick "brown" fox "jumps over, (the) lazy" dog )" '(the ("(quick)" brown fox "jumps (over, the)" lazy) dog )' .match(reg)[0]; //"("(quick)" brown fox "jumps (over, the)" lazy)" '(the (quick brown fox (jumps "over", ((the) "lazy"))) dog )' .match(reg)[0]; //"(the)"</code>
<code>str.replace(substr,"&&&") str.replace(substr,"&&&").match(/\([^()]+\)/g)[0] str.replace(substr,"&&&").match(/\([^()]+\)/g)[0].replace("&&&",substr) </code>
本题难点在需要对""进行递归统计,例如
<code>(level_id = "D AND subject_id = "(Cat)"")</code>
(cat)是符合要求的.
<code>\([^()]*?\"((?:[^\"\"]|\"(?1)\")*+)\"[^()]*?\)|\([^()]*?\) </code>
真爱生命,远离正则,该正则可以满足你的要求,php能用(php支持递归)java及Python无法使用.
推荐一个思路,找到(的index,切字符串处理
手机发不出正则 黑线
楼主的【^()】里如果不匹配()则继续
把不匹配(的条件去掉,把贪婪的+改成*?即可
!代码
console.log('(subject_id = “A” OR (status_id = “Open” AND (status_id = “C” OR level_id = “D”)))'.match(/(1*)/))
希望对你有帮助
用正则匹配会比较复杂,建议 把干扰串 "( 和 )" 替换掉,比如 "[, ]",再用简单的正则替换,之后再换回来。
正则用 Python 实现如下:
<code>import re str1 = '(subject_id = "A" OR (status_id = "Open" AND (status_id = "C" OR level_id = "D")))' str2 = '(subject_id = "A" OR subject_id = "Food" OR (subject_id = "C" OR (status_id = "Open" AND (status_id = "C" OR (level_id = "D" AND subject_id = "(Cat)")))))' pat = re.compile(r"""(?<=[^"]) \([^()]+? ("\(.+?\)")* \) (?=[^"]) """, re.X) print pat.search(str1).group(0) print pat.search(str2).group(0)</code>
输出为:
<code>(status_id = "C" OR level_id = "D") (level_id = "D" AND subject_id = "(Cat)") </code>