2

このソフトウェア dk-brics-automaton を使用して、正規表現の状態数を取得します。たとえば、次のタイプの RE があります。

  ^SEARCH\s+[^\n]{10}

以下に文字列として挿入すると、コンパイラは無効なエスケープシーケンスだと言います

  RegExp r = new RegExp("^SEARCH\s+[^\n]{10}", ALL);

ここで、ALL は特定の FLAG です

小さな s の前に二重バック スラッシュを使用すると、コンパイラはそれを文字列として受け入れます。ここで \s はスペースを意味しますが、二重バック スラッシュを使用すると混乱し、バック スラッシュと "s" だけが考慮されます。ここで、空白を意味しました。

今、私は有限オートマトンの状態を計算したいそのような正規表現を何千も持っています.それで、すべてのREに手動でバックスラッシュを追加する必要があるということですか?

これに関連する何かを説明しているリンクがありますが、私はそれを理解していません:

http://www.brics.dk/automaton/doc/index.html

過去にこのソフトウェアを使用した経験のある方、またはこの問題を解決するアイデアがある方は、助けてください。

4

1 に答える 1

2

私はそのドキュメントをもう一度見ました。「automaton」は Java パッケージなので、Java 正規表現のように扱う必要があると思います。したがって、正規表現内のすべてのバックスラッシュを 2 倍にするだけです。

ここで問題なのは、Java は「生の」文字列を認識しないということです。したがって、 2 つのレベルでエスケープする必要があります。エスケープ シーケンスを評価する最初のレベルは文字列レベルです。

文字列はエスケープ シーケンスを認識していません\s。これがエラーです。\n文字列はそれを評価し、代わりに 2 つの文字\(0x5C) とn(0x6E) の文字を格納します0x0A

次に、文字列が格納され、正規表現コンストラクターに渡されます。ここで、エスケープ シーケンス評価の次のラウンドが行われます。

したがって、正規表現レベルでエスケープしたい場合は、バックスラッシュを 2 つにする必要があります。\\文字列レベルはtoを評価する\ため、正規表現レベルは正しいエスケープ シーケンスを取得します。

于 2013-06-21T06:02:39.563 に答える