2016-04-14 46 views
3

我試圖做一個搜索功能,允許您將搜索分成兩部分,當您插入|字符和搜索後鍵入。Lua:如何在一個字符後開始匹配

到目前爲止,我已經理解如何通過在空間之前捕獲主要命令。

一個例子是,如果我鍵入:禁止用戶,下面的框仍然會說:ban,但是當我輸入|時,它會重新開始搜索。

:ba 
:ba 

:ban user|:at 
:at 

:ban user|:attention members|:kic 
:kic 

此代碼:

text=":ban user|:at" 
text=text:match("(%S+)%s+(.+)") 
print(text) 

仍然會返回禁令。

+0

感謝您的快速補丁了! – Dolvik

+0

我只是不明白你期望用'「:ban user |:at''input:':at',還是'at'得到的結果?請參閱https://ideone.com/NJlJM3 –

+0

我試圖在最終獲得一場比賽之後|字符。 – Dolvik

回答

3

我試圖得到最後的匹配|字符。

然後你可以使用

​​

Lua demo

說明

  • .* - 任何0+字符多達possibl匹配(在「貪婪」的方式,因爲誰樂弦被抓住,然後發生回溯找到...)
  • %| - 最後的文字|
  • (.*) - 匹配和捕捉任何0+字符(直到字符串的結尾)。
+0

在沒有|時搜索失敗。 https://ideone.com/5Gzhmr – Dolvik

+0

Lua模式的問題是您無法定義可選序列。因此,我們需要在'new_text'變量中使用'if-else'來返回'nil'時的原始'text'值。 –

+1

好吧,聽起來合理,會做。除了Lua是一個足夠快的引擎。 :d,謝謝。 – Dolvik

2

爲了避免特殊情況下,確保該字符串總是有|

function test(s) 
    s="|"..s 
    print(s:match("^.*|(.*)$")) 
end 

test":ba" 
test":ban user|:at" 
test":ban user|:attention members|:kic" 
+0

這是一個聰明的舉動,在'''之前預先申請's'。 –

+0

@WiktorStribiżew,許多使用分隔符的模式匹配問題可以從這種一致性中受益。請參閱http://stackoverflow.com/a/35826360/107090。 – lhf

相關問題