64

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

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

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

4

4 に答える 4

68

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

Lua パターンの S/N 比が POSIX 正規表現よりも高いというのは、それほど特殊な例ではありません。多くの場合、好ましいのは全体的なデザインであり、特定の例ではありません。

優れた設計に寄与するいくつかの要因を次に示します。

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

  • 引用は非常にシンプルで規則的です。引用文字は%であるため、文字列引用文字 とは常に区別されます\。これにより、Lua のパターンが POSIX 正規表現よりもはるかに読みやすくなります (引用が必要な場合)。記号を引用することは常に安全であり、文字を引用する必要は決してないため、どの記号が特別なメタ文字であるかを覚える代わりに、その経験則に従うことができます.

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

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

  • Lua パターンの表現力は、代替演算子を使用しない POSIX の「基本的な」正規表現に匹敵し|ます。あなたがあきらめているのは、 を使用した「拡張された」正規表現|です。それだけの表現力が必要な場合は、LPEG を使用することをお勧めします。LPEGを使用すると、本質的に文脈自由文法の機能を非常に妥当なコストで利用できます。

于 2010-04-23T05:47:46.790 に答える
8

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

質問に答えるために(そして私は決してLuaの第一人者ではないことに注意してください)、この言語には組み込みアプリケーションで使用されるという強い伝統があり、完全な正規表現エンジンはプラットフォームで使用されるコードのサイズを過度に大きくします、Luaライブラリ自体のすべてよりもはるかに大きい場合があります。

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

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

于 2010-04-22T18:42:42.867 に答える
2

わかりました、この議論のためのちょっとした注意事項です。私は特にこのページに混乱しました:

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の検索/置換の正規表現を参照しています-Luaの正規表現構文(sciteも使用しています)ではありません。

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

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

...確かに機能します。

したがって、Lua の「パターン」は Lua の「正規表現」とは異なるコマンド/エンジンであると最初は考えていたので、Lua の「パターン」Lua 固有の「正規表現」構文/エンジン (言い換えれば、それらのうちの 2 つはありません:)) 。

乾杯!

于 2012-05-02T10:34:15.013 に答える