2016-03-24 13 views
4

:=パスについて予期Luaのパターンマッチング結果

local function getParentPath(_path) 

    pattern = "(.+)([/\\][/\\])(.+)" 
    i,j,k = string.match(path,pattern) 
    return i,j,k 

end 

print(getParentPath(path)) 

"C://data//file.text"、Iを得る:

C://data // file.text 

しかしパスについて

= "C:\ data \ file.text"、私は得る:

nil nil nil 

私は両方のためのwoksを探しています。助言がありますか?

+0

の終わりには、あなたが一致することを期待しなかった何の詳細をで手の込んだことはできますか?最後の '/'まで?あなたの文字列には2つの文字列があり、1つの例から本当に必要なものは明確ではありません。 –

+0

申し訳ありませんが私の質問に額を付けました – tanzil

答えて

5

問題は、最初の.+が貪欲にマッチし、最後まで\まで戻ってから後退することです。次に、1つの\[\\/]と一致することができます。したがって、最初のグループにはバックスラッシュが1つあり、2番目のグループには2番目のグループがあります。

あなたは参照してください

pattern = "^(.-)([/\\]+)([^/\\]+)$" 

を使用して、それを修正することができますIDEONE demo

説明:

  • ^ - 文字列の先頭
  • (.-) - 任意の文字が、怠惰な(できるだけ少ないです-限定記号と一致)
  • ([/\\]+) - 1+ /または\
  • ([^/\\]+) - /\
  • $以外1+文字 - 文字列
+1

また、http://stackoverflow.com/questions/9102126/lua-return-directory-path-from-pathを確認してください –

+1

詳細な説明をありがとう!!!! – tanzil

3

これは完全に予想されます。最初の欲望(.+)は、次のパターンを破ることなくできるだけ多くのシンボルに一致します。つまり、([/\\]+)を一致させるために必要な最後のスラッシュまでです。