2014-07-15 56 views
2

如何從類似csv的字符串中提取值,並將新行字符(\r\n\n)與模式一起刪除。模式匹配丟棄新行字符

甲行看起來像:

1.1;2.2;Example, 3 

通知僅存在3個值和隔板是;。我遇到的問題是想出一個模式,在刪除新行字符的同時讀取值(該文件來自Windows機器,因此它具有\ r \ n,從Linux讀取並希望獨立來自所使用的新行字符)。

我的簡單的例子,現在是:

s = "1.1;2.2;Example, 3\r\n"; 
p = "(.-);(.-);(.-)"; 
a, b, c = string.match(s, p); 
print(c:byte(1, -1)); 

由上述代碼打印的最後兩個字符是\r\n

的問題是,既,\r\n由%C和%s類(控制字符和空格字符)通過該代碼檢測作爲顯示:

s = "a\r"; 
print(s:match("%c")); 
print(s:match("%s")); 
print(s:match("%d")); 

所以,是有可能從比賽中排除新線字符? (不應該假定最後兩個字符是新行字符)

3º值可能包含空格,標點符號和字母數字字符,並且由於\r\n被檢測爲空格字符,所以像`「(.-); (.-);([%w%s%c] - )。*「不起作用。

回答

3

你的模式

p = "(.-);(.-);(.-)";

不起作用:第三場總是空的,因爲.-一點匹配越好。您需要在字符串的結尾來錨定它,但隨後的第三場將包含換行符字符:

p = "(.-);(.-);(.-)$";

所以,只停留在第一尾換行字符。這也決定了最後一場比賽。試試這個模式來代替:

p = "(.-);(.-);(.-)[\r\n]";

如果換行符字符是可選的,試試這個模式:

p = "(.-);(.-);(.-)[\r\n]*$";

+0

是的,我搞砸了模式。根據你的模式,我將它修改爲'p =「(.-);(.-);(.-)%c * $」;所以它也適用於沒有換行字符的情況。謝謝。 –

+0

@JavierMr,看我編輯的答案。 – lhf

3

沒有任何LUA的經驗,我發現了一個天真的解決方案:

clean_CR = s:gsub("\r",""); 
clean_NL = clean_CR:gsub("\n",""); 

符合POSIX正則表達式語法我會使用

^([^;]*);([^;]*);([^\n\r]*).*$ 

..用 「\ n」 和 「\ r」 可能包括作爲「^ M」,「^ @」(控制/ unicode字符)..取決於你的編輯器。

+3

如果你走這條路線,它的簡單做's = s:gsub(「[\ r \ n] +」,「」)'。 – lhf

+0

認爲會有一個更短的方式,我只是不知道盧阿 - upvoted您的評論增值! – flowtron