質問
私は現在Luaを学んでいます。 LUAのパターンマッチングに関して、lua.orgのLUAドキュメントで次の文を見つけました。
それにもかかわらず、LUAでのパターンマッチングは強力なツールであり、標準のPOSIX実装と一致するのが難しいいくつかの機能が含まれています。
Posixの正規表現に精通しているので、LUAパターンマッチングが正規表現と比較して「より良い」一般的なサンプルがあるかどうかを知りたいですか、それとも文を誤解しましたか?そして、一般的な例がある場合:なぜパターンマッチング対正規表現のいずれかがより適しているのですか?
解決
LUAパターンマッチングが正規表現と比較して「より良い」一般的なサンプルはありますか?
LUAパターンは、POSIXの正規表現よりも信号対雑音比が高いという点では、それほど特別な例ではありません。特定の例ではなく、多くの場合望ましい全体的なデザインです。
優れたデザインに寄与するいくつかの要因があります。
大文字を含む一般的な文字タイプを一致させるための非常に軽量の構文(
%u
)、10進数(%d
)、スペース文字(%s
) 等々。対応する大文字を使用して、任意の文字タイプを補完することができるため、パターン%S
非空間文字に一致します。引用は非常にシンプルで規則的です。引用文字はです
%
, 、したがって、それは常に文字列引用文字とは異なります\
, 、これにより、LUAパターンは、POSIXの正規表現よりも読みやすくなります(引用が必要な場合)。シンボルを引用することは常に安全であり、文字を引用することは決して必要ありません。そのため、どのシンボルが特別なメタカラクターであるかを記憶するのではなく、その経験則で行くことができます。Luaは「キャプチュ」を提供し、の結果として複数のキャプチャを返すことができます
match
電話。このインターフェイスは、副作用を介してサブストリングをキャプチャする、またはキャプチャを見つけるために尋問する必要がある隠された状態を持つよりもはるかに優れています。キャプチャ構文はシンプルです:括弧を使用するだけです。ルアは「最短の試合」を持っています
-
「最長の試合」と一緒に行く修飾子*
オペレーター。たとえば、s:find '%s(%S-)%.'
スペースが前に行われ、ドットが続く非空間文字の最短シーケンスを見つけます。LUAパターンの表現力は、代替演算子なしではPOSIX「基本的な」正規表現に匹敵します
|
. 。あなたがあきらめているのは、「拡張」の正規表現です|
. 。あなたがそんなに多くの表現力を必要としているなら、私はずっと行くことをお勧めします lpeg これにより、本質的には、かなり合理的なコストでコンテキストフリーの文法の力が得られます。
他のヒント
http://lua-users.org/wiki/librariesandbindings Regexライブラリを使用して使用し続ける場合は、機能のリストが含まれています。
質問に答えるため(そして私は決してルアの第一人者であることに注意してください)、言語は埋め込まれたアプリケーションで使用されるという強い伝統を持っています。そこでは、完全な正規表現エンジンがプラットフォームで使用されているコードのサイズを過度に増やすでしょう。 、時にはすべてのLUAライブラリ自体よりもはるかに大きくなります。
編集] LUAのプログラミングのオンラインバージョン(言語を学習するための優れたリソース)で見つけたばかりです。これは、言語の原則の1つによって説明されています。以下のコメントを参照してください[/編集
私は、LUAを提供するデフォルトのパターンが私の正規表現のニーズのほとんどを満たすことを個人的に見つけました。あなたのマイレージは異なる場合があります。
わかりました、この議論のためのわずかなnoobのメモ。私は特にこのページに混乱しました:
それが言うので \s
私が他の正規表現の構文から知っているように、Whitespaceに一致します...そして私はシェルでそれを試しています:
$ 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のRegex構文(Sciteも使用している)ではなく、言及しています。
それから私は読み直します lua-users wiki:パターンチュートリアル, 、そして、エスケープキャラクターが存在するというコメントを取得し始めます %
, 、 いいえ \
の @normanramseyの答え。だから、これを試してみてください:
> print("_".. c:match("[%s]*") .."_")
_ _
...確かに機能します。
だから、私が元々ルアの「パターン」はルアの「正規表現」とは異なるコマンド/エンジンであると思っていたので、それはより良い方法だと思います:ルアの「パターン」 それは LUA固有の「正規表現」構文/エンジン(言い換えれば、それらの2つはありません :)
)
乾杯!