引数を使用してLuaでrfindを実装するにはどうすればよいですか?

ジャックマロー

たとえば、luaで次のようなことをしたいと思います。

s = "Hey\n There And Yea\n"

print(s.rfind("\n", 0, 5))

string.find関数を使用してluaでこれを作成してみました:

local s = "Hey\n There And Yea\n"

local _, p = s:find(".*\n", -5)

print(p)

しかし、これらは同じ結果を生み出していません。何が間違っているのでしょうか。これを修正してrfindと同じにする方法を教えてください。

アリスター

私が書いたパターンは、askerがテストケースとして使用したような単一文字の部分文字列に対してのみ機能します。次の太字のヘッダーにスキップしてその答えを確認するか、彼らが試みで間違ったことのいくつかの説明を読んでください。複数文字の部分文字列の一般的で非効率的なソリューションについては、最後の太字ヘッダーにスキップしてください

mystring.rfindluaを使用してPythonの出力を再作成しようとしましたがmystring:find、これは1文字の部分文字列に対してのみ機能します。後で、すべての場合にそれを実行するが、かなり悪いループである関数を紹介します。

要約として(あなたが間違っていることに対処するために)mystringvar:find("pattern", index)、砂糖について話しましょうstring.find(mystringvar, "pattern", index)これにより、start, stopインデックスが返されます。

オプションのインデックスは、終了ではなく開始を設定しますが、負のインデックスは「右マイナスインデックス」から文字列の終了まで逆方向にカウントします(インデックス-1は最後の文字のみを評価し、-2は最後の2を評価します)。これは望ましい動作ではありません。

インデックスを使用して部分文字列を作成する代わりに、次のような部分文字列を作成する必要があります。
mystringvar:sub(start, end)最初から最後まで部分文字列を抽出して返します(1つのインデックス付きの終わりを含む)。したがって、Pythonの0-5(0インデックス付き、排他的終了)を再作成するには、1-5を使用します。

これらのメソッドは連鎖することができますstring:sub(x, y):find("")が、読みやすくするために分割することに注意してくださいそれ以上の苦労なしに、私はあなたに提示します:
答え

local s = "Hey\n There And Yea\n"
local substr = s:sub(1,5)
local start, fin = substr:find("\n[^\n]-$")
print(start, ",", fin)

いくつかの半分の測定ソリューションがありましたが、私が書いているものが複数の部分文字列インスタンス(1〜5の部分文字列には1つしか含まれていない)で機能することを確認するために、部分文字列と文字列全体でテストしました。観察:
sub(1、5)での出力sub(1、19 )での4 , 5
出力(全長):19 , 19

これらは両方とも右端の部分文字列の始まりを正しく報告しますが、「fin」インデックスは文の終わりに行くことに注意してください。後で説明します。とにかくrfindは開始インデックスのみを返すので、これで問題ないことを願っています。したがって、これは適切な置換であるはずです。

コードを読み直して、どのように機能するかを見てみましょう。sub
すでに説明しまし
たstring.findにインデックスは
もう必要ありません"\n[^\n]-$"このパターンは何ですか?
$-文の終わりにアンカーします
[^x]-「xではありません」に
-一致します-前の文字またはセット(この場合は[^\n])の一致をできるだけ少なくします(0でも)。これは、文字列が部分文字列で終わっていても機能することを意味します)
\ nで始まるので、まとめると次のようになります。「文の終わりまで、改行を見つけてください。その後に改行はありません。 。」つまり、部分文字列に含まれる\ nのインスタンスは1つだけですが、複数の部分文字列を持つ文字列でこの関数を使用すると、rfindと同様に、最高のインデックスが得られます。

string.findはパターングループ(())に準拠していないため\n、をグループでラップするの無駄であることに注意してください結果として、エンドアンカー$fin変数を文の終わりまで拡張するのを止めることはできません

これがあなたにとってうまくいくことを願っています。

任意の長さの部分文字列に対してこれを行う関数これについては
説明しません。

function string.rfind(str, substr, plain) --plain is included for you to pass to find if you wish to ignore patterns
  assert(substr ~= "") --An empty substring would cause an endless loop. Bad!
  local plain = plain or false --default plain to false if not included
  local index = 0
  --[[
    Watch closely... we continually shift the starting point after each found index until nothing is left. 
        At that point, we find the difference between the original string's length and the new string's length, to see how many characters we cut out. 
  ]]--
  while true do
    local new_start, _ = string.find(str, substr, index, plain) --index will continually push up the string to after whenever the last index was.
    if new_start == nil then --no match is found
            if index == 0 then return nil end   --if no match is found and the index was never changed, return nil (there was no match)
      return #str - #str:sub(index)  --if no match is found and we have some index, do math.
    end
    --print("new start", new_start)
    index = new_start + 1 --ok, there was some kind of match. set our index to whatever that was, and add 1 so that we don't get stuck in a loop of rematching the start of our substring.
  end
end

あなたは私のために全体の「テスト・スイート」を参照したい場合は、これを...

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

(任意の)引数を使用して(任意の)関数を呼び出す関数を実装するにはどうすればよいですか?

分類Dev

Cで連分数を使用して自然対数を実装するにはどうすればよいですか?

分類Dev

RustでWindowsIOCPを使用して非同期関数を実装するにはどうすればよいですか?

分類Dev

`splitAt`を使用してVecに` rotate`関数を実装するにはどうすればよいですか?

分類Dev

実行時に引数を指定してFragmentFactoryを使用するにはどうすればよいですか?

分類Dev

複数のinit継承を使用してsuper()を実装するにはどうすればよいですか?

分類Dev

Pythonを使用して `単項関数chainer`を実装するにはどうすればよいですか?

分類Dev

APIを使用して除外関数を実装するにはどうすればよいですか

分類Dev

Coqの引数としてメンバーシップ証明を使用してremoveを実装するにはどうすればよいですか?

分類Dev

FsCheckを使用して複数の引数の生成を実装するにはどうすればよいですか?

分類Dev

引数を追加して合計できる汎用関数をscalaに実装するにはどうすればよいですか?

分類Dev

C ++を使用してmatlabでuniqueの動作を実装するにはどうすればよいですか?

分類Dev

Kotlinでnull可能な「beanName」を使用してBeanPostProcessorを実装するにはどうすればよいですか?

分類Dev

AndroidでSpinnerを使用して検索を実装するにはどうすればよいですか?

分類Dev

式でCOUNT()を複数回使用してOVERを実装するにはどうすればよいですか?

分類Dev

KotlinでFirebaseを使用して電話認証を実装するにはどうすればよいですか?

分類Dev

JavaでHashMapを使用してスタックを実装するにはどうすればよいですか?

分類Dev

ajaxを使用してDjangoで編集を実装するにはどうすればよいですか?

分類Dev

C#でopenclを使用して行列乗算を実装するにはどうすればよいですか?

分類Dev

QPainter + QPixmapを使用してマウスで描画を実装するにはどうすればよいですか?

分類Dev

Vue.jsを使用してこれを実装するにはどうすればよいですか?

分類Dev

kthreadsを使用して補完を適切に実装するにはどうすればよいですか?

分類Dev

Expressを使用してnodeJSに管理パネルを実装するにはどうすればよいですか?

分類Dev

Javaを使用して特定のUMLを厳密に実装するにはどうすればよいですか?

分類Dev

Volleyを使用してAndroidにログインを実装するにはどうすればよいですか?

分類Dev

JavaScript を使用して Div 内に Div を実装するにはどうすればよいですか?

分類Dev

標準のフックを使用してLuaにブレークポイントを実装するにはどうすればよいですか?

分類Dev

使用しているPython実装を確認するにはどうすればよいですか?

分類Dev

使用しているPython実装を確認するにはどうすればよいですか?

Related 関連記事

  1. 1

    (任意の)引数を使用して(任意の)関数を呼び出す関数を実装するにはどうすればよいですか?

  2. 2

    Cで連分数を使用して自然対数を実装するにはどうすればよいですか?

  3. 3

    RustでWindowsIOCPを使用して非同期関数を実装するにはどうすればよいですか?

  4. 4

    `splitAt`を使用してVecに` rotate`関数を実装するにはどうすればよいですか?

  5. 5

    実行時に引数を指定してFragmentFactoryを使用するにはどうすればよいですか?

  6. 6

    複数のinit継承を使用してsuper()を実装するにはどうすればよいですか?

  7. 7

    Pythonを使用して `単項関数chainer`を実装するにはどうすればよいですか?

  8. 8

    APIを使用して除外関数を実装するにはどうすればよいですか

  9. 9

    Coqの引数としてメンバーシップ証明を使用してremoveを実装するにはどうすればよいですか?

  10. 10

    FsCheckを使用して複数の引数の生成を実装するにはどうすればよいですか?

  11. 11

    引数を追加して合計できる汎用関数をscalaに実装するにはどうすればよいですか?

  12. 12

    C ++を使用してmatlabでuniqueの動作を実装するにはどうすればよいですか?

  13. 13

    Kotlinでnull可能な「beanName」を使用してBeanPostProcessorを実装するにはどうすればよいですか?

  14. 14

    AndroidでSpinnerを使用して検索を実装するにはどうすればよいですか?

  15. 15

    式でCOUNT()を複数回使用してOVERを実装するにはどうすればよいですか?

  16. 16

    KotlinでFirebaseを使用して電話認証を実装するにはどうすればよいですか?

  17. 17

    JavaでHashMapを使用してスタックを実装するにはどうすればよいですか?

  18. 18

    ajaxを使用してDjangoで編集を実装するにはどうすればよいですか?

  19. 19

    C#でopenclを使用して行列乗算を実装するにはどうすればよいですか?

  20. 20

    QPainter + QPixmapを使用してマウスで描画を実装するにはどうすればよいですか?

  21. 21

    Vue.jsを使用してこれを実装するにはどうすればよいですか?

  22. 22

    kthreadsを使用して補完を適切に実装するにはどうすればよいですか?

  23. 23

    Expressを使用してnodeJSに管理パネルを実装するにはどうすればよいですか?

  24. 24

    Javaを使用して特定のUMLを厳密に実装するにはどうすればよいですか?

  25. 25

    Volleyを使用してAndroidにログインを実装するにはどうすればよいですか?

  26. 26

    JavaScript を使用して Div 内に Div を実装するにはどうすればよいですか?

  27. 27

    標準のフックを使用してLuaにブレークポイントを実装するにはどうすればよいですか?

  28. 28

    使用しているPython実装を確認するにはどうすればよいですか?

  29. 29

    使用しているPython実装を確認するにはどうすればよいですか?

ホットタグ

アーカイブ