今、文字列があります:
リーリーまたは
リーリー正規表現を使用して、文字列内の 最も内側の 括弧とその内容を照合する必要があります (引用符内の括弧との照合ではありません)。つまり、
リーリーそれでは、この非常に複雑な正規表現をどのように記述すればよいでしょうか?
正規表現が実装できない場合、JS でどのように実装できますか?
追加、str1
に関して、マッチングを満たすことができるような正規表現を見つけました:
しかし、str2についてはまだ解決策がありません。皆さんの回答をお待ちしています。
今、文字列があります:
リーリーまたは
リーリー正規表現を使用して、文字列内の 最も内側の 括弧とその内容を照合する必要があります (引用符内の括弧との照合ではありません)。つまり、
リーリーそれでは、この非常に複雑な正規表現をどのように記述すればよいでしょうか?
正規表現が実装できない場合、JS でどのように実装できますか?
さらに、str1
に対して、マッチングを満たすことができるこのような正規表現を見つけました:
しかし、str2についてはまだ解決策がありません。皆さんの回答をお待ちしています。
str2については、これを見つけました
リーリー
要件を見た後、正規表現を使用することはまったく考えていませんでした。複雑すぎるように思えました...従来の方法をそのまま使用しましょう
操作の優先順位 のアイデアを使用できます。 スタックデータ構造を使用して内側の括弧の内容を取得します ;技術的なポイント:
このアルゴリズムは、一致する部分文字列を計算します。
部分文字列を取得するメソッド。
startIndex
和 endIndex
然后用 substring()
"("
文字が一致すると、。"("
字符的时,入栈,当我们匹配到第一个 ")"
最初の ")"
と一致すると、 がスタックからポップされます。 stack
"""
时,则停止匹配 "("
,直到搜索到下一个 """
时,才继续开始搜索 "("
は
これは私がブレインストーミングを通じて考え出したアルゴリズムです。不足している点があれば、お気軽に追加してください。
//こうしてみてください/(([^()]*?"[^"()]*([^"()]+)[^()]*?"[^() ]*)+)|([^()]+)/
ニーズを分析 > 需要点ごとにソリューションを見つける > ソリューションを統合する = 問題を解決する
は( a )
ここで、a
包含的字符有两种可能,用a1
和a2
は
a1
含有一个或多个 b " c " b
フォーム内の文字列
ここで、b
是一段不包括 "
, (
或 )
は文字列です
ここで、c
是一段不包括 "
は文字列です
a2
中不含有 (
或 )
2.1 =>2.2 =>
2.1.2 =>a2
=[^()]*
a2
=[^()]*
2.1.1 =>b
=[^()"]*
2.1.2 =>c
=[^"]*
2.1 =>a1
=(b"c"b)+
=(b"c")+b
=([^()"]*"[^"]*")+[^()"]*
1 =>(a)
=(a1)|(a2)
=(([^()"]*"[^"]*")+[^()"]*)|([^()]*)
2.1.1 =>b
=[^( )"]*
c
=[^"]*
a1
= (b"c"b)+
= (b"c")+b
=([^()"]*"[^"]*" )+[^()"]*
(a)
= (a1)|(a2)
= (([ ^()"]*"[^"]*")+[^()"]*)|([^()]*)
リーリー
検証:
リーリー次に、次のように変更します:
リーリー
最も内側の括弧とその中の値を取得し、値の最初の桁が "" であるかどうか、最後の桁が "" であるかどうかを判断します。 🎜 リーリー 🎜それが存在しない場合は、それが必須の答えです。存在する場合は、まず str の substr を置き換えてから一致させ、最後に元に戻します。<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>