web-dev-qa-db-ja.com

Luaパターンマッチングと正規表現

私は現在luaを学んでいます。 luaのパターンマッチングに関して、lua.orgのluaドキュメントで次の文を見つけました。

それでも、Luaのパターンマッチングは強力なツールであり、標準のPOSIX実装とのマッチングが困難な機能がいくつか含まれています。

私はposixの正規表現に精通しているので、正規表現と比較してluaパターンマッチングが「より良い」一般的なサンプルがあるかどうかを知りたいのですが、文を誤解しましたか?また、一般的な例がある場合:パターンマッチングと正規表現のどちらが適しているのですか?

62
aurora

Luaパターンマッチングが正規表現と比較して「より良い」一般的なサンプルはありますか?

LuaパターンはPOSIX正規表現よりも高い信号対雑音比を持っているので、それほど特別な例ではありません。多くの場合、特定の例ではなく、全体的な設計が好ましいです。

良いデザインに寄与するいくつかの要因は次のとおりです。

  • 大文字(_%u_)、10進数(_%d_)、スペース文字(_%s_)などの一般的な文字タイプに一致する非常に軽量な構文。対応する大文字を使用して任意の文字タイプを補完できるため、パターン_%S_はスペース以外の文字と一致します。

  • 引用は非常に簡単で定期的です。引用文字は_%_であるため、文字列引用文字_\_とは常に区別されます。これにより、POSIX正規表現よりもLuaパターンが読みやすくなります(引用が必要な場合)。記号を引用することは常に安全であり、文字を引用する必要はありません。そのため、記号が特別なメタキャラクターであるかを覚えるのではなく、その経験則に従ってください。

  • Luaは「キャプチャ」を提供し、match呼び出しの結果として複数のキャプチャを返すことができます。このインターフェースは、副作用を介して部分文字列をキャプチャしたり、キャプチャを検索するために調査する必要がある隠された状態を持つよりもはるかに優れています。キャプチャ構文は単純です。括弧を使用するだけです。

  • Luaには、「最長一致」_-_演算子とともに使用する「最短一致」_*_修飾子があります。したがって、たとえばs:find '%s(%S-)%.'は、スペースが先行しドットが後続する非スペース文字の最短シーケンスを検索します。

  • Luaパターンの表現力は、代替演算子_|_なしのPOSIX「基本」正規表現に匹敵します。あきらめているのは、_|_を使用した「拡張」正規表現です。そのような表現力が必要な場合は、 [〜#〜] lpeg [〜#〜] に移動することをお勧めします。これにより、本質的に文脈に依存しない文法の力をかなりリーズナブルなコストで提供できます。

67
Norman Ramsey

http://lua-users.org/wiki/LibrariesAndBindings 正規表現ライブラリを使用し続ける場合は、正規表現ライブラリを含む機能のリストが含まれます。

この質問に答えるために(そして私は決してLuaの第一人者ではないことに注意してください)、この言語には組み込みアプリケーションで使用される強い伝統があります。 、時にはLuaライブラリ自体のすべてよりもはるかに大きい場合があります。

[編集] Luaのプログラミングのオンラインバージョン(言語を学習するための優れたリソース)で、言語の原則の1つで説明されているところを見つけました。以下のコメントを参照[/編集]

個人的には、Luaが提供するデフォルトのパターンマッチングが、正規表現のニーズのほとんどを満たしていることがわかりました。あなたのマイレージは異なる場合があります。

7
Keith Pimmel

さて、この議論のためのちょっとしたメモです。私はこのページで特に混乱しました:

SciTE正規表現

私が他の正規表現構文から知っているように、\sは空白に一致すると言うので...そして、私はそれをシェルで試しています:

$ lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> c="   d"
> print(c:match(" "))

> print(c:match("."))

> print(c:match("\s"))
nil
> print("_".. c:match("[ ]") .."_")
_ _
> print("_".. c:match("[ ]*") .."_")
_   _
> print("_".. c:match("[\s]*") .."_")
__

うーん... \sはここでは認識されないようです-そのため、そのページはおそらくSciteのFind/Replaceの正規表現を参照しています-Luaの正規表現構文(これはsciteも使用しています)ではありません。

次に、 lua-users wiki:Patterns Tutorial を読み直し、 @ NormanRamsey%ではなく\であるエスケープ文字に関するコメントの取得を開始しますの答え。だから、これを試して:

> print("_".. c:match("[%s]*") .."_")
_   _

...実際に動作します。

だから、私はもともとLuaの「パターン」はLuaの「正規表現」とは異なるコマンド/エンジンであると考えていたので、より良い言い方をすると思います。Luaの「パターン」are Lua固有の「正規表現」構文/エンジン(言い換えると、2つはありません:)

乾杯!

1
sdaau