2

英語は私の母国語ではないので、質問を説明するのは少し難しいです。
lua string.gsub()によってstrで'd = 40'を取得したいのですが、いくつか問題があります。

------以下のコード---
ローカルstr=[== [ --a =
10 ---
b = 20
--c = 30
d = 40
] ==]

ローカルpat1=[= [%s [%s]]=]
ローカルpat2= [= [\ n [%s]] =]
str:gsub(pat1、function(s)print( "pat1 >>" .. s )end)--pat1 >> d = 40
str:gsub(pat2、function(s)print( "pat2 <<" .. s)end)--一致しません

ローカルre1、_ = str:gsub( "\ n"、 "$")
ローカルre2、_ = str:gsub( "%s"、 "$")
print(re1)--a = 10 $--b = 20 $ --c = 30 $ d = 40 $
print(re2)-$ a = 10 $-$-b = 20 $$ --c = 30 $ d = 40 $

Lua 5.1リファレンスマニュアルのよう
に%sと言う:すべてのスペース文字を表します。
'\ n'、''、'\t'に等しいと思います。

質問:なぜpat2が一致しないのですか?
しかし、pat2は正しいと思います。「d = 40」の前に「\n」がある
ので、一致する可能性があると思いますが、機能しないのはなぜですか。

4

1 に答える 1

3

文字列に表記を使用する場合[[]]、それは指定したとおりに文字列を受け取る特別な文字列リテラルです。文字のエスケープは行われません。=文字列で[文字を使用しやすくするために、角かっこにいくつかの文字を入れることができます。

文字列リテラル"\n"は、改行を表す1文字です。これは、エスケープ文字を使用しているためです\。'n'文字に適用されるエスケープ文字は、「改行文字」を意味します。

文字列リテラル[[\n]]は、まさにそのとおりです。文字「\」の後に文字「n」が続きます。エスケープが行われないため、\n特別に扱われません。それはまさにそれがどのように見えるかです。

したがって、local pat2 = [=[\n[%s]]=]「最初の文字は「\」、「n」、スペースの順にする必要があります。これは目的ではありませ。エスケープを機能させる必要があります。したがって、通常の文字列リテラルを使用する必要があります。local pat2 = "\n[%s]"

于 2012-04-14T18:44:27.730 に答える