【问题标题】:Pattern match dropping new lines characters模式匹配删除换行符
【发布时间】:2014-07-15 11:25:07
【问题描述】:

如何从类似 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]-) .*" 不起作用。

【问题讨论】:

    标签: lua lua-patterns


    【解决方案1】:

    你的模式

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

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

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

    所以,只需在第一个尾随换行符处停止。这也锚定了最后一场比赛。试试这个模式:

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

    如果尾随换行符是可选的,试试这个模式:

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

    【讨论】:

    • 是的,我弄乱了模式。根据您的模式,我将其修改为 `p = "(.-);(.-);(.-)%c*$";因此,如果没有换行符,它也可以工作。谢谢。
    【解决方案2】:

    在没有任何 lua 经验的情况下,我找到了一个幼稚的解决方案:

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

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

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

    .. 可能包含“\n”和“\r”作为“^M”、“^@”(控制/unicode 字符).. 取决于您的编辑器。

    【讨论】:

    • 如果你走那条路,那么s=s:gsub("[\r\n]+","")会更简单。
    • 认为会有更短的方法,我只是不知道 lua - 赞成您的评论以增加价值!
    猜你喜欢
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    相关资源
    最近更新 更多