2017-04-18 98 views
2

我對這個論壇相當陌生。我無法操縱正確的字符串來實現此目的。Lua字符串操作(前後查找單詞)

基本上,我想要做的是接收輸入的字符串這樣的例子:

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] 

我只是想成爲一個可以將該字符串排序到鍵值表中,其中鍵是每個=之前的所有單詞,並且該值是之後相等但逗號之前的所有單詞。 有沒有人有建議?

+0

您嘗試的第二個只在最後缺少一個加號以匹配多個字符。除此之外,你的例子不會運行(例如,在FOR之後沒有DO,gmatch在成對,str和s),所以如果你得到它的工作,它不是你在這裏發佈的方式。這應該工作:'s ='問好=堆棧溢出,說再見=其他資源' 問題,答案在s:gmatch'([%w%s] +)=([%w%s] +)'do print(question,answer) end' – tonypdmtr

+0

糟糕,我在編輯器中輸入了它。雖然我在我使用的控制檯上做了這些。 – 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次或更多次。

作爲@lhf建議可以使用一個更簡單的表達式:(.-)=(.-),%s*,這意味着:採取所有字符,直到所述第一=-使得匹配的非貪婪),然後取所有字符,直到所述第一,

+1

模式'「(.-)=(.-),%s *」'更簡單。 – lhf

+0

感謝保羅,這種模式確實有效。雖然仍然有點混淆你在這些集合中添加的錨點。頭腦稍微詳細闡述? – syntaxs

+0

更新了答案以進一步闡述。 –