匹配模式删除换行符。

如何使用模式从类似于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\]-).\*"的模式不起作用。

点赞
用户3022387
用户3022387

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

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

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

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

.. "\n"和"\r"可能作为"^M","^@"(控制/ Unicode字符)包含在内,这取决于你的编辑器。

2014-07-15 11:38:25
用户107090
用户107090

你的匹配模式

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

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

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

因此,只需在第一个行尾换行符处停止即可。这也锚定了最后一次匹配。请尝试以下模式:

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

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

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

2014-07-15 12:16:32