5

私はこれを1時間または2時間遊んでいて、Luaパターンマッチングユーティリティのある障害物にいることに気づきました。文字列内の引用符で囲まれたすべてのテキストを照合し、必要に応じて置き換えようとしています。

私がこれまでに思いついたパターンは次のとおりです:(\?[\ "\'])(.-)%1

これは場合によっては機能しますが、すべての場合ではありません。

Working: "This \"is a\" string of \"text to\" test with"

Not Working: "T\\\"his \"is\' a\" string\" of\' text\" to \"test\" wit\\\"h"

動作しない例では、一致させたい(希望する一致を取得する関数を作成しました。gsubで使用するパターンを探しているだけで、luaパターンでこれができるかどうか知りたいです):

 string
 a" string" of
is' a" string" of' text
test
his "is' a" string" of' text" to "test" wit

とりあえず代わりに関数を使い続けるつもりですが、使うことができる/すべきパターンがあり、パターンのあるものが欠けているだけなのか気になります。

(スタックオーバーフローのフォーマットを忘れたb / cのいくつかの編集)(htmlを解析しようとしているという仮定につながっていたため、html以外の例を作成するための別の編集)

4

4 に答える 4

5

正規表現を使用してエスケープされた引用テキストを一致させようとすることは、芝刈り機を使用してフィールドからデイジー(およびデイジーのみ)を削除しようとするようなものです。

思い通りのマッチが得られる関数を作りました

これは正しい動きです。

luaパターンでこれができるかどうか知りたい

実用的な観点から、パターンがこれを行うことができるとしても、あなたはしたくありません。 理論的な観点から、偶数の円記号が前に付いている二重引用符を見つけようとしています。これは間違いなく正規言語であり、必要な正規表現は次のようになります(Luaの引用規則)

[[[^\](\\)*"(.-[^\](\\)*)"]]

そして、引用された文字列は結果#2になります。しかし、Luaパターンは完全な正規表現ではありません。*特に、括弧で囲まれたパターンの後に置くことはできません。したがって、この問題はLuaパターンを使用して解決することはできないと思いますが、Luaパターンはオートマトン理論の標準的なものではないため、それを証明するために使用できる一連の証明手法を私は知りません。

于 2010-12-01T03:05:12.883 に答える
2

エスケープされた引用符の問題は、一般に、引用符の前に奇数の円記号がある場合はエスケープされ、偶数の場合はそうではないということです。Luaのパターンマッチングがこの状態を表すのに十分強力であるとは思わないので、このようなテキストを解析する必要がある場合は、別の方法を探す必要があります。おそらく、文字列を反復処理して解析するか、各引用符を順番に見つけて逆方向に読み、バックスラッシュ以外の文字(または文字列の先頭)が見つかるまでバックスラッシュを数えることができます。

何らかの理由でどうしてもパターンを使用する必要がある場合は、これを複数のステップからなるプロセスで試すことができます。まず、2つのバックスラッシュが連続して出現するすべての場合にgsubを実行し、それらを番兵の値に置き換えます。これは、文字列でまだ発生していない値である必要があります。この文字列に印刷できない文字が含まれていないことがわかっている場合は、「\001」のようなものを試すことができます。とにかく、2つのバックスラッシュのすべてのシーケンスを連続して置き換えると、残っているバックスラッシュはすべて次の文字をエスケープします。これで、元のパターンを適用できます。最後に、番兵値のすべてのインスタンスを2つの円記号で置き換えることができます。

于 2010-11-30T22:06:45.557 に答える
1

Luaのパターン言語は、多くの単純なケースに適しています。また、一般的な正規表現パッケージにはないトリックが少なくとも1つあります。それは、バランスの取れた括弧に一致させる方法です。しかし、それには限界もあります。

これらの制限を超えると、LPegに到達します。LPegは、LuaのParsing Expression Grammerの実装であり、Luaの元の作成者の1人によって実装されたため、Luaへの適応は非常にうまく行われます。PEGを使用すると、単純なパターンから完全な言語文法まで、あらゆるものを指定できます。LPegは文法をバイトコードにコンパイルし、非常に効率的に実行します。

于 2010-12-01T07:26:27.103 に答える
0

HTMLを正規表現で解析しようとしてはいけません。HTMLとXMLは正規言語はなく、正規表現で正常に操作することはできません。専用のHTMLパーサーを使用する必要があります。ここに理由がたくさん説明されています

于 2010-11-30T20:41:13.727 に答える