3

(...)式に括弧が含まれているかどうかを判断しようとしていますが、角括弧内に(...)ありません。これは、いくつかの単純な Lisp スタイルの式を解析および処理するために使用されます。

角括弧内にないスペース文字で文字列を分割するために使用した次の作業式を採用しましたが、上記の場合と同じ効果を達成できないようです。

私が使用している表現:

/(\[.*?\]|(\(.*\)+))/g

hasPair 関数からの望ましい出力を含む式の例のリストを次に示します。

 - (+ 2 2) -> true
 - (+ 2 (- 4 2)) -> true
 - [(+ 2 2)] -> false 
 - [(def i (+ 2 2)] -> false
 - (defn add [+ 2 2]) -> true
 - def add [(+ 2 2)] -> false
 - (defn add x y [(+ x y]) -> true

明らかな何かが欠けている可能性がありますが、それが何であるかはわかりません。

(違いがあれば、表現は常にバランスが取れています)

4

4 に答える 4

1
(?:[^[]|^)\(([\w]*)\)(?!\])

正規表現の視覚化

Debuggex でライブ編集

あなたが探しているものを本当に確信していませんが、これはそれがどのように見えるかです!

新しい編集:

(?:[^[]|^)?\((.*)\)(?!\])

正規表現の視覚化

Debuggex でライブ編集

編集3:

(?:[^[]|^)\((.*?)\)(?:(?!\]))

正規表現の視覚化

Debuggex でライブ編集

于 2013-09-04T18:15:53.043 に答える
1

正規表現は多くのツールの 1 つにすぎず、特定のタスクに最も適していますが、これはその 1 つではありません。

ペアが常にバランスが取れている場合、実際に必要なのは天気を知ること、または特定の文字列の左括弧の前に左角括弧がないことだけです。

これは、以下を評価することで非常に簡単に達成できます。

str.indexOf('[') < str.indexOf('(')
于 2013-09-04T19:05:51.963 に答える
1

多分あなたはこれを試すことができます:

\([^\)]+\)(?![^\[]*\])

正規表現101のデモ

これは、角かっこ (および私が思うにかっこも) のバランスがとれている場合にのみ機能します。

編集:さて、それは今ではクレイジーな正規表現ですxD

\((?:[^\)\[\]]+|(?:[^\[\]\)]*\[[^\[\]\)]*\][^\[\]\)]*))*\)(?![^\[]*\])

regex101 再試行

于 2013-09-04T18:29:22.067 に答える
0

ここでは物事をシンプルにすることをお勧めします。以下のコードを検討してください。

/\([^)]*\)/.test(str.replace(/\[[^\]]*\]/g, ''));

このタスクを 2 つのステップで解決します。

  1. 第 1 段階: すべての[...]一致を空の文字列に置き換えます""
  2. 第 2 段階:置換された文字列に(...)がまだ存在するかどうかを確認します。

Working Demo: http://ideone.com/aVu9iR

于 2013-09-04T18:54:57.350 に答える