2017-06-22 5 views
3
local s = "http://example.com/image.jpg" 
print(string.match(s, "/(.-)%.jpg")) 

これは私これは貪欲ではなく、私にイメージ名だけを与えるのはなぜですか?

--> /example.com/image 

を与えるしかし、私は正規表現エンジンは、左から右に文字列を処理しているので

--> image 
+0

これはあなたのために働いてうれしいです。私の答えがあなたにとって有益であると判明した場合は、upv​​otingを検討してください([Stack Overflowについてのアップルのしくみ?](http://meta.stackexchange.com/questions/173399/how-to-upvote-on-stack-overflow)参照)あなたは15のレポートポイントに達し、アップボーティングを受けることができるようになりました。 –

答えて

2

を取得したいのですが、あなたのパターンは.-、その後、最初の/ました可能な限り少数の文字(.)()の最初のリテラル.%.と一致)までマッチし、続いてjpg部分文字列。

enter image description here

あなたは、任意の文字に一致する否定文字クラス[^/](任意の文字が、/にマッチする)のではなく.を使用する必要があります。

local s = "http://example.com/image.jpg" 
print(string.match(s, "/([^/]+)%.jpg")) 
-- => image 

online Lua demo

[^/]を参照してください。任意の文字と一致しますしかし/、したがって、th最後の/は、"/([^/]+)%.jpg"というパターンの最初の/と一致します。パターンから最初/を削除

が一致するものを見つけるためにしようとしているとき、それはエンジンの使用以上の冗長の手順を行いますと、良いアイデアではありません、/は「アンカー」は定量化されますenter image description here

として、それがマッチしますサブパターンは /シンボルです。エンジンが /以外の文字の0+(最初から定義されていない)数を探すよりも、エンジンが /を見つける方が簡単です。

文字列の最後にこの文字列が表示されている場合は、パターンの末尾に$を追加します(必要があれば実際には表示されませんが、一般的には最適です)。

+0

先頭の '/'は冗長です。また、最後に '$ 'を持たないと、フォルダ名に予期せず一致する可能性があります(ただし、そうでないかもしれません)。その名前に' .jpg'が含まれています。おそらく ''([^ /] +)%.jpg $''がより正確です。 – tonypdmtr

+0

@tonypdmtr: '$'は良いアイデアだと思いますが、 '/'を削除するとパフォーマンスが悪くなります。 –

3

あなたは/だけで、ファイル名の前に文字列であることを確認している場合は、この作品:

print(string.match(s, ".*/(.-)%.jpg")) 

必要に応じて、貪欲試合.*/は、最後/で停止します。

2

なぜこれは貪欲ではなく、私にイメージ名を与えませんか?

直接質問に答えるために:試合の左部分がまだ現在の位置で固定されており、何かがその位置に一致した場合、それが結果として返されますよう.-が最短一致を保証するものではありません。 。貪欲でないということは、残りのパターンが一致している限り、そのパターンでマッチした文字のうち最も少ない文字数を消費することを意味します。そのため、[^/]-を使用すると、スラッシュではない文字のうち最短文字数が見つかるため、パターンが修正され、なぜ.*/.-がこの場合のように機能するのですか。.*は、すべてを貪欲に消費し、残りのパターンが満足されるまでこの場合の同じ結果)。

関連する問題