6

一致する文字列パターンを実行して、入力文字列または入力文字列"ab|cd"に一致する方法はありますか。のようなものをパターンとして使用し、またはのいずれかに一致することは知っていますが、それは1文字のものに対してのみ機能します。"ab""cd""[ab]""a""b"

私の実際の問題はもっと複雑ですが、基本的には、Lua の文字列操作に OR があるかどうかを知る必要があるだけです。実際には、OR の両側に他のパターンを配置したいと考えてい"hello|world"ます。"hello, world!""hello""world"

4

3 に答える 3

5

Lua パターンで論理演算子を使用すると、ほとんどの問題を解決できます。たとえば、正規表現[hello|world]%d+の場合、次を使用できます

string.match(str, "hello%d+") or string.match(str, "world%d+")

or演算子のショートカット回路は、文字列hello%d+が最初に一致することを確認し、失敗した場合は一致するようにしますworld%d+

于 2013-10-07T02:03:13.077 に答える
3

peterm の提案を拡張するために、lpeg は、lpegによって提供される追加のパワーと柔軟性を維持しながらre、同様のインターフェイスを lua の標準ライブラリに公開するモジュールも提供します。string

reモジュールの構文は lpeg に比べて難解ではないため、最初にモジュールを試してみることをお勧めします。hello world の例と一致する使用例を次に示します。

dump = require 'pl.pretty'.dump
re = require 're'


local subj = "hello, world! padding world1 !hello hello hellonomatch nohello"
pat = re.compile [[
  toks  <-  tok (%W+ tok)*
  tok   <-  {'hello' / 'world'} !%w / %w+
]]

res = { re.match(subj, pat) }
dump(res)

出力は次のとおりです。

{
  "hello",
  "world",
  "hello",
  "hello"
}

一致の位置をキャプチャすることに興味がある場合は、位置キャプチャ用に文法を少し変更するだけです。

tok   <-  {}('hello' / 'world') !%w / %w+
于 2013-10-07T01:45:07.267 に答える