javascript - 最も内側の括弧の内容と一致する正規表現

WBOY
リリース: 2016-08-04 09:19:46
オリジナル
1530 人が閲覧しました

今、文字列があります:

リーリー

または

リーリー

正規表現を使用して、文字列内の 最も内側の 括弧とその内容を照合する必要があります (引用符内の括弧との照合ではありません)。つまり、

リーリー

それでは、この非常に複雑な正規表現をどのように記述すればよいでしょうか?

正規表現が実装できない場合、JS でどのように実装できますか?


追加、str1に関して、マッチングを満たすことができるような正規表現を見つけました:

リーリー

しかし、str2についてはまだ解決策がありません。皆さんの回答をお待ちしています。

返信内容:

今、文字列があります:

リーリー

または

リーリー

正規表現を使用して、文字列内の 最も内側の 括弧とその内容を照合する必要があります (引用符内の括弧との照合ではありません)。つまり、

リーリー

それでは、この非常に複雑な正規表現をどのように記述すればよいでしょうか?

正規表現が実装できない場合、JS でどのように実装できますか?


さらに、str1に対して、マッチングを満たすことができるこのような正規表現を見つけました:

リーリー

しかし、str2についてはまだ解決策がありません。皆さんの回答をお待ちしています。

str2については、これを見つけました

リーリー

要件を見た後、正規表現を使用することはまったく考えていませんでした。複雑すぎるように思えました...従来の方法をそのまま使用しましょう
操作の優先順位 のアイデアを使用できます。 スタックデータ構造を使用して内側の括弧の内容を取得します ;技術的なポイント:

  1. 一番内側の括弧と一致させます

  2. 引用符内の内容は一致基準として使用されません

次の考えに基づいてアルゴリズムの設計を開始します。

このアルゴリズムは、一致する部分文字列を計算します。
部分文字列を取得するメソッド。 startIndexendIndex 然后用 substring()

    "(" 文字が一致すると、
  • がスタックにプッシュされます

    "(" 字符的时,入栈,当我们匹配到第一个 ")"最初の ")" と一致すると、 がスタックからポップされます。 stack

    、つまり 2 つのインデックス間の部分文字列がターゲット文字列
  • です。

    """ 时,则停止匹配 "(" ,直到搜索到下一个 """ 时,才继续开始搜索 "("

    と一致します。

これは私がブレインストーミングを通じて考え出したアルゴリズムです。不足している点があれば、お気軽に追加してください。

//こうしてみてください
/(([^()]*?"[^"()]*([^"()]+)[^()]*?"[^() ]*)+)|([^()]+)/


追加:

ニーズを分析 > 需要点ごとにソリューションを見つける > ソリューションを統合する = 問題を解決する

分析要件:

  1. ( a )

  2. の形式と一致する必要があります
  3. ここで、a 包含的字符有两种可能,用a1a2

    を意味します
    1. a1含有一个或多个 b " c " bフォーム内の文字列

      1. ここで、b 是一段不包括 ", ()は文字列です

      2. ここで、c 是一段不包括 "は文字列です

    2. a2中不含有 ()

逆導出:

2.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 = [^( )"]*

2.1.2 => c = [^"]*
2.1 => a1= (b"c"b)+ = (b"c")+b =([^()"]*"[^"]*" )+[^()"]*

1 => (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*)/))
希望对你有帮助
"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>
ログイン後にコピー

输出为:

<code>(status_id = "C" OR level_id = "D")
(level_id = "D" AND subject_id = "(Cat)")
</code>
ログイン後にコピー
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート