模式匹配丢弃新行字符

时间:2014-07-15 11:25:08

标签: lua lua-patterns

如何从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

问题是%c和%s类(控制字符和空格字符)检测到\r\n,如下代码所示:

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

那么,是否有可能从比赛中省略新的线条字符? (不应该假设最后两个字符是新行字符)

3º值可能包含空格,标点符号和字母数字字符,因为\r\n被检测为空格字符,形式为“”(.-);(.-);([%w%s%c] - )。*“不起作用。

2 个答案:

答案 0 :(得分:3)

没有任何经验,我找到了一个天真的解决方案:

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

使用POSIX正则表达式语法我会使用

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

..“\ n”和“\ r”可能包括为“^ M”,“^ @”(控制/ unicode字符)..取决于你的编辑。

答案 1 :(得分:3)

你的模式

  

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

不起作用:第三个字段始终为空,因为.-尽可能匹配。您需要将其锚定在字符串的末尾,但第三个字段将包含尾随的换行符:

  

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

所以,只需停在第一个尾随换行符char。这也是最后一场比赛的主力。请尝试使用此模式:

  

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

如果尾随换行符是可选的,请尝试以下模式:

  

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