3

私の環境:

  • ルア5.1
  • ネイティブ コンポーネント (C .so/.dll など) を含むライブラリは絶対に使用できません。
  • 任意の純粋な Lua 5.1 コードを実行できosますが、ネイティブ ファイルシステム、シェル コマンドなどへのアクセスを許可するいくつかの他のパッケージにはアクセスできないため、すべての機能を Lua 自体 (のみ) に実装する必要があります。
  • 私はすでにLuLpegを取り込むことができました。おそらく、他の純粋な Lua ライブラリを取り込むことができます。

true入力文字列が文字と数字の任意のシーケンスに1 回以上繰り返される単語全体として一致し、一致する部分文字列全体の先頭または末尾に句読点がある場合に返す関数を作成する必要があります。PCRE の単語境界と同じ意味で「単語全体」を使用します\b

reこのアイデアを実証するために、LuLpegのモジュールを使用した誤った試みを次に示します。否定的な先読みでは機能するようですが、否定的な後ろ向きでは機能しないようです:

function containsRepeatingWholeWord(input, word)
    return re.match(input:gsub('[%a%p]+', ' %1 '), '%s*[^%s]^0{"' .. word .. '"}+[^%s]^0%s*') ~= nil
end

文字列の例と期待される戻り値を次に示します (引用符は、文字列のリテラル部分ではなく、Lua インタープリターに入力されたかのように構文的です。これは、末尾/先頭のスペースを明確にするために行われます)。

  • 入力: " one !tvtvtv! two"単語: tv戻り値: true
  • 入力: "I'd"単語: d戻り値: false
  • 入力: "tv"単語: tv戻り値: true
  • 入力: " tvtv! "単語: tv戻り値: true
  • 入力: " epon "単語: nope戻り値: false
  • 入力: " eponnope "単語: nope戻り値: false
  • 入力: "atv"単語: tv戻り値: false

完全な PCRE 正規表現ライブラリがあれば、これをすぐに実行できますが、C にリンクできないため実行できません。また、PCRE などの純粋な Lua 実装も見つかりませんでした。

LPEG が (LPEG を直接またはそのreモジュールを介して) 柔軟に使用して、私がやりたいことを実行できるかどうかはわかりませんが、組み込みの Lua 関数では、私がやりたいことを実行できないことは確かです。文字の繰り返しシーケンスを処理します。Lua の組み込み関数など(tv)+では動作しません。string:match

これを行う方法を見つけようと精査してきた興味深いリソースは役に立ちませんでした:

4

2 に答える 2