2016-04-14 2 views
3

私はあなたが|を挿入すると検索を2つに分割できる検索機能を作ろうとしています。あなたが入力したものの後に検索します。Lua:文字の後にマッチを開始する方法

これまでのところ、スペースの前にキャプチャしてメインコマンドを保持する方法を理解しました。

私が「ban user」と入力すると、下のボックスは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

私は、あなたが '' input: ':at'、または' at'で、 ':'を使用して得ることを期待していることを理解していませんか? https://ideone.com/NJlJM3を参照してください –

+0

私は最終的な後に試合をしようとしている|キャラクター。 – Dolvik

答えて

3

私は最終的な後に試合をしようとしています|キャラクター。任意の0+文字数( possibl限り多くと一致する -

  • .*

次に、あなたはLua demo

説明を参照してください

​​

を使用することができます"貪欲な"方法、誰がル文字列)...つかんで、その後、バックトラッキングを見つけるために発生している

  • %| - |
  • (.*)最後のリテラル - 試合と()文字列の最後までの任意の0+文字をキャプチャします。
  • +0

    |を付けずに検索すると失敗します。 https://ideone.com/5Gzhmr – Dolvik

    +0

    Luaパターンの問題は、オプションのシーケンスを定義できないことです。したがって、ここで 'if-else'を' new_text'変数とともに使用して、 'nil'が返されたときに元の' text'値を復元する必要があります。 –

    +1

    申し訳ありませんが、合理的に聞こえます。ルアに加えて、十分に速いエンジンです。 :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

    関連する問題