3

正確に 3 つのアルファベット文字を含む文法を書いています。これが私のコードです:

local l = require "lpeg"

l.locale(l)

local date = l.digit^1 * l.P'/' * l.digit^1 * l.P'/' * l.digit^1
local time = l.digit^1 * l.P':' * l.digit^1 * l.P':' * l.digit^1 * l.P':' * l.digit^1  
local timezone = l.alpha^3
local stamp = l.P'[' * date * l.P' ' * time * l.P' ' * timezone * l.P']'

grammar = l.C(stamp)

私が照合している入力は次のとおりです。

[4/23/15 4:49:49:371 CDT]

タイムゾーンの 3 文字のアルファベットのみに一致する式を取得するにはどうすればよいですか? このコードが現在機能する方法は、3つ以上のアルファベット文字に一致することです。


変!これは機能しますか?

local timezone = l.alpha*2

そのようですが、ここで参照されている構文が見つかりません。

http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html

4

1 に答える 1

3

l.alpha*2ですl.alpha * l.P(2)

いいえ、それは一致し[a-z]..ます。

からの出力を参照して、lpeg.print(timezone)それを確認してください。ll(ロケール データに を使用していることに注意してください。同じテーブルに配置すると、元のprintデバッグ機能が失われます。)

> l=require"lpeg"
> ll=lpeg.locale()
> p=ll.alpha*2
> l.print(p)
[]
00: set [(41-5a)(61-7a)]-> FAIL
05: any * 2-> FAIL
06: end
> =p.match("099")
nil
> =p.match("EST")
4
> =p.match("E99")
4

必要なパターンは次のとおりです。

> function patcount(pat, min, max)
>>  return -pat^(max + 1) * pat^min
>> end
> p=patcount(ll.alpha, 3, 3)
> lpeg.print(p)
[]
00: set [(41-5a)(61-7a)]-> 27
05: choice -> 27 (1)
06: set [(41-5a)(61-7a)]-> FAIL
11: set [(41-5a)(61-7a)]-> FAIL
16: set [(41-5a)(61-7a)]-> FAIL
21: span [(41-5a)(61-7a)]
26: failtwice
27: set [(41-5a)(61-7a)]-> FAIL
32: set [(41-5a)(61-7a)]-> FAIL
37: set [(41-5a)(61-7a)]-> FAIL
42: span [(41-5a)(61-7a)]
47: end
> =p:match("EST")
4
> return p:match("ES")
nil
> return p:match("ESTT")
nil
> return p:match("099")
nil
> return p:match("E99")
nil

関連するドキュメントのビットは-patt.

l.alpha*2マニュアルからのこの引用で説明されている構文について。

引数としてパターンを期待するすべての操作は、関数 lpeg.P の規則に従ってパターンに変換される文字列、テーブル、数値、ブール値、または関数も受け取ることができます。

つまり、オペランドの 1 つがすでにパターンである場合、演算子は非パターンをパターンに変換します。

LpegRecipes lua-users.org wiki ページには、「パターンの一定回数の繰り返しに一致させる」セクション (およびリンク) もあります。(しかし、私はその実装をまったく調べていません。上記の実装よりも複雑に見えます。)

于 2015-04-23T21:21:43.993 に答える