0

JavaScriptコードからコメントを切り取る必要があるファイルパーサーに取り組んでいます。'//'重要なのは、コメントの始まりとして文字列内のシーケンスを使用しないように、スマートである必要があるということ です。私はそれを行うために次のアイデアを持っています:

行を繰り返します。最初にシーケンスを検索し、次に引用符(または)で'//'囲まれたすべての文字列を検索してから、すべての文字列の一致を繰り返し処理して、シーケンスがそれらの文字列の1つの内側または外側にあるかどうかを確認します。それがそれらの外にある場合、それが適切なコメントの始まりになることは明らかです。'"'//'

次の行でコードをテストする場合(もちろん、より大きなjsファイルの一部):

document.getElementById("URL_LABEL").innerHTML="<a name=\"link\" href=\"http://"+url+"\" target=\"blank\">"+url+"</a>";

問題が発生しました。私の正規表現コード:

re_strings=re.compile("""   "
                            (?:
                            \\.|
                            [^\\"]
                            )*
                            "
                            |
                            '
                            (?:
                                [^\\']|
                                \\.
                            )*
                            '
                            """,re.VERBOSE);


for s in re.finditer(re_strings,line):
            print(s.group(0))

Python 3.2.3(および3.1.4)では、次の文字列が返されます。

"URL_LABEL"
"<a name=\"
" href=\"
"+url+"
" target=\"
">"
"</a>"

文字列を終了するべきではないので、これは明らかに間違ってい\"ます。私はかなり長い間正規表現をデバッグしてきましたが、ここで終了するべきではありません。そこで、参考のためにhttp://re-try.appspot.com/にあるRegexBuddy(Python互換性あり)とPythonregexテスターを使用しました。最も独特なことは、両方とも私のコード以外の同じ正しい結果を返すことです。つまり、次のとおりです。

"URL_LABEL"
"<a name=\"link\" href=\"http://"
"\" target=\"blank\">"
"</a>"

私の質問は、それらの違いの原因は何ですか?私は何を見落としましたか?私はPythonと正規表現の両方の初心者なので、答えは簡単かもしれません...

PS'//'シーケンスが文字列引用符の中にあるかどうかを見つけるには、1つの大きな正規表現を使用して実行できることを知っています。私はすでにそれを試し、同じ問題に遭遇しました。

PPS何が間違っているのか、コードと正規表現テストアプリケーションの動作に違いがある理由を知りたいのですが、JavaScriptコードを解析する他のアイデアは見つかりません。

4

2 に答える 2

2

生の文字列を使用して正規表現を作成するだけです。

re_strings=re.compile(r"""   "
                             etc.
                             "
                        """,re.VERBOSE);

あなたがそれを手に入れた方法は、リテラルドット()または引用符( )ではないものと一致する\\.|[^\\"]regex になります。文字列リテラルにプレフィックスを追加すると、意図したとおりに機能します。\.|[^\"]."r

ここでデモを参照してください。(バックスラッシュがターゲット文字列に表示されることを確認するために生の文字列も使用しました。テストでそれをどのように配置したかはわかりませんが、バックスラッシュは明らかに存在します。問題は、それらが正規表現にないことです。 )

于 2012-08-31T03:02:15.607 に答える
1

正規表現で一致する引用符を処理することはできません...実際、何か の一致するペア(特にネストされたペア)を保証することはできません...そのためのより洗練されたステートマシンが必要です(LLVMなど...

ソース:CSクラスがたくさん...

また、詳細な説明については、 「ペアタグと正規表現のマッチング」も参照してください。

私はそれがあなたが聞きたかったものではないことを知っていますが、それは基本的にそれがそうであるようです...そしてそうです正規表現の異なる実装は正規表現が実際にできないものに対して異なる結果を返すことができます

于 2012-08-30T22:52:47.140 に答える