2017-04-18 15 views
2

私はこのフォーラムではかなり新しいです。これを達成するために正しい文字列を操作することに問題があります。ルア文字列操作(前と後の単語の検索)

基本的に、私がやろうとしているが、この例のように入力文字列を受け取ります:

str = "Say hello to=Stack overflow, Say goodbye to=other resources" 

for question, answer in pairs(string.gmatch(s, "(%w+)=(%w+)")) 
    print(question, answer) 
end 

私はそれを返すようにしたい:質問=「によろしく」と=「スタックオーバーフロー、質問に答えます= "さよならを言いなさい"などというより、等号と直後の言葉の直前の言葉を拾います。私は数量詞を試したこともありますが、それと全く同じことをします。 私もこのパターンを試しました。

[%w%s]*=[%w%s] 

私はちょうどいいこの文字列をキー=値テーブルにソートすると、各キーは各=の前のすべての単語であり、値はその等号の後でカンマの前のすべての単語です。 誰かが提案をしていますか?続く、 '' =[^=])以外のものを除いて、次に何を1回以上(+)は=続い繰り返して:

+0

2回目の試行では、複数の文字と一致するように末尾にプラス記号がありません。それ以外の例は実行されません(例:FORの後にDOがない、対になって一致する、strとs)。その場合は、ここで投稿した方法ではありませんでした。これはうまくいくはずです: 's = 'スタックオーバーフロー、他のリソースにさようなら言ってください' 質問に答えてください:gmatch '([%w%s] +)=([%w%s] +) 'do print(質問、回答) end' – tonypdmtr

+0

私はエディタでそれを打ちました。私はコンソールにdoを持っていましたが、私は使っていました。 – syntaxs

答えて

3

あなたはこのようなものを使用することができます。

local str = "Say hello to=Stack overflow, Say goodbye to=other resources" 
for question, answer in string.gmatch(str..",", "([^=]+)=([^,]+),%s*") do 
    print(question, answer) 
end 

"([^=]+)=([^,]+),%s*"は、次のことを意味しコンマおよびオプションの空白(次の質問にそれらを含めるのを避けるため)。私はまた、文字列にカンマを追加したので、最後のペアも解析します。表現[^=]+で、[=]は1つの許可文字(=)とのセットを指定し、[^=]はそれが=除いて許可され、任意の文字とセットですので、ことを否定して+ができますコメントでビットさらに要求ごと詳述すると

1回以上繰り返すように設定されています。最初=まで、すべての文字を取り、その後最初,まで、すべての文字を取る(-非貪欲が一致します):(.-)=(.-),%s*、意味:

は@lhfあなたはシンプルな表現を使用することができます示唆したように。

+1

パターン ""(.-)=(.-)、%s * "'は簡単です。 – lhf

+0

ありがとうポール、パターンは実際に動作しました。これらのアンカーではまだ混乱していますが、あなたはセットに追加しました。もう少し精巧な精神? – syntaxs

+0

さらに詳しく説明する答えが更新されました。 –

関連する問題