javascript – Regulärer Ausdruck, der dem Inhalt der innersten Klammer entspricht

WBOY
Freigeben: 2016-08-04 09:19:46
Original
1530 Leute haben es durchsucht

Jetzt gibt es eine Zeichenfolge:

<code>str1 = '(subject_id = "A" OR (status_id = "Open" AND (status_id = "C" OR level_id = "D")))'
</code>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren

Aber für str2 gibt es immer noch keine Lösung. Ich freue mich auf Ihre Antworten!

Antwortinhalt:

Jetzt gibt es eine Zeichenfolge:

<code>str1 = '(subject_id = "A" OR (status_id = "Open" AND (status_id = "C" OR level_id = "D")))'
</code>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren

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:

  1. entspricht der innersten Klammer

  2. 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

  • Wenn ein

    -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

    Wenn
  • mit einem

    übereinstimmt, wird die Übereinstimmung mit """ beendet und die Suche nach "(" erst dann fortgesetzt, wenn nach dem nächsten """ gesucht wird. "("

Dies ist ein Algorithmus, den ich mir ausgedacht habe. Wenn es Mängel gibt, können Sie diese gerne hinzufügen.

//Auf diese Weise versuchen Sie
/(([^()]*?"[^"()]*([^"()] )[^( )]*?"[^()]*) )|([^()] )/


Ergänzung:

Bedürfnisse analysieren > Lösungen für jeden Bedarfspunkt finden > Lösungen integrieren = Probleme lösen

Anforderungen analysieren:

  1. muss mit der Form von

    ( a )

    übereinstimmen
  2. Es gibt zwei Möglichkeiten für die in

    enthaltenen Zeichen: a und a1 zur Darstellung von a2

    1. Eine Zeichenfolge, die eine oder mehrere a1-Formen enthält, b " c " b

      1. wobei

        eine Zeichenfolge b" ist, die (, ) oder

        nicht enthält
      2. wobei

        eine Zeichenfolge c" ist, die

        nicht enthält
    2. enthält weder a2 noch ()

Umgekehrte Ableitung:

2.2 =>

= a2[^()]*2.1.1 => 🎜>2.1 =>
= b =[^()"]*
1 => c = [^"]* =
a1(b"c"b) (b"c") bRegulärer Ausdruck: ([^()"]*"[^"]*") [^()"]*
(a)Verifizierung: (a1)|(a2) (([^()"]*"[^"]*") [^()"]*)|([^()]*)

Dann ändern Sie es so:

<code>/\(([^\(\)\"]*\"[^\"]*\")+[^\(\)\"]*\)|\([^\(\)]*\)/</code>
Nach dem Login kopieren
Ermitteln Sie die innerste Klammer und den darin enthaltenen Wert und bestimmen Sie dann, ob die vorherige Ziffer des Werts „“ ist und ob die letzte Ziffer „“ ist:

<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>
Nach dem Login kopieren
Wenn es nicht existiert, ist es die erforderliche Antwort. Wenn es existiert, ersetzen Sie zuerst substr in str, passen Sie es dann an und ersetzen Sie es schließlich wieder:

<code>str.replace(substr,"&&&")
str.replace(substr,"&&&").match(/\([^()]+\)/g)[0]
str.replace(substr,"&&&").match(/\([^()]+\)/g)[0].replace("&&&",substr)
</code>
Nach dem Login kopieren

本题难点在需要对""进行递归统计,例如

<code>(level_id = "D AND subject_id = "(Cat)"")</code>
Nach dem Login kopieren

(cat)是符合要求的.

<code>\([^()]*?\"((?:[^\"\"]|\"(?1)\")*+)\"[^()]*?\)|\([^()]*?\)
</code>
Nach dem Login kopieren

真爱生命,远离正则,该正则可以满足你的要求,php能用(php支持递归)java及Python无法使用.

推荐一个思路,找到(的index,切字符串处理

手机发不出正则 黑线
楼主的【^()】里如果不匹配()则继续
把不匹配(的条件去掉,把贪婪的+改成*?即可

!代码

console.log('(subject_id = “A” OR (status_id = “Open” AND (status_id = “C” OR level_id = “D”)))'.match(/(1*)/))
希望对你有帮助
"javascript


  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>
Nach dem Login kopieren

输出为:

<code>(status_id = "C" OR level_id = "D")
(level_id = "D" AND subject_id = "(Cat)")
</code>
Nach dem Login kopieren
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage