Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 以符合现有代码期望的方式迭代可能的空行_String_Iterator_Lua_Pattern Matching - Fatal编程技术网

String 以符合现有代码期望的方式迭代可能的空行

String 以符合现有代码期望的方式迭代可能的空行,string,iterator,lua,pattern-matching,String,Iterator,Lua,Pattern Matching,我曾经用一个简单的 for line in s:gmatch("[^\r\n]+") do 而且效果很好!然后现实生活发生了 。。。。现在我的要求已经改变了:我也需要在空行上进行匹配。问题是:由于这种形式的迭代在多个位置使用,这些位置本身都是丛林,所以我希望尽可能避免更改周围的代码。迄今为止,我尝试使用gmatch/find未能创建上述模式的“插入式”替代品,原因是对上述功能无法匹配的细微期望 我所寻找的构造(用于某些匹配器中的线)符合以下要求,我相信这些要求涵盖了我所担心的所有边缘情况:

我曾经用一个简单的

for line in s:gmatch("[^\r\n]+") do
而且效果很好!然后现实生活发生了

。。。。现在我的要求已经改变了:我也需要在空行上进行匹配。问题是:由于这种形式的迭代在多个位置使用,这些位置本身都是丛林,所以我希望尽可能避免更改周围的代码。迄今为止,我尝试使用
gmatch
/
find
未能创建上述模式的“插入式”替代品,原因是对上述功能无法匹配的细微期望

我所寻找的构造(
用于某些匹配器中的线
)符合以下要求,我相信这些要求涵盖了我所担心的所有边缘情况:

   INPUT            EXPECTATIONS

1. ''            -- match once   ('')
2. '\r\n'        -- match twice  ('', '')
3. '\r\n\r\n'    -- match thrice ('', '', '')
4. 'aaa'         -- match once   ('aaa')
5. 'aaa\r\n'     -- match twice  ('aaa', '')
6. 'aaa\r\nbbb'  -- match twice  ('aaa', 'bbb')
7. '\r\nbbb'     -- match twice  ('', 'bbb')
我的旧解决方案假定只发生
\r\n
行结束,如果新解决方案只处理该场景,则完全没有问题


然而,由于我的商店里有关于Linux支持计划的讨论,如果能给出一个更简单的
\n
行结尾(为了将来的unix兼容性)的答案,我们将不胜感激,这样就可以省去几个月后对这个问题的再讨论。但是,在许多情况下,我需要原始字符串输入中此匹配的起始列。如果上面的构造(
for…do
)可以将其作为一个额外的优点输出,那将是非常棒的。

如果您需要准确地检测换行线边界,而不是以跨平台的方式跳过/丢弃它们,那么您不能使用同时包含
\r
\n
的集合,因为它将匹配换行符序列
\r\n
两次而不是一次(CRLF是DOS/Windows上的单个换行符)。您可以使用功能足够强大的正则表达式引擎(例如,支持替换)来处理这个问题,但是Lua的模式匹配库非常小

最好的方法是在处理文本之前规范化换行符,如下所示:

function normalize_eols(s)
    return s
        :gsub('\r\n','\n')
        :gsub('\r', '\n')
end
至于输入=>输出网格,如果我们将换行符视为行分隔符,那么我希望
[^\n]*
(零个或多个非换行字符)可以工作,但我们得到以下结果:

''         => ('')
'\n'       => ('', '')
'\n\n'     => ('', '', '')
'aaa'      => ('aaa', '')
'aaa\n'    => ('aaa', '', '')
'aaa\nbbb' => ('aaa', '', 'bbb', '')
'\nbbb'    => ('', 'bbb', '')
坦白说,我不知道为什么

但是,如果我们认为换行符是一个行终止符,那么我们可以通过向输入追加一个换行符并使用模式
[^\n]*\n
(零个或多个非换行字符后跟一个换行符)来获得您想要的结果:

因此,您的代码将更改为:

s = normalize_eols(s) .. '\n'
for line in s:gmatch('([^\n]*)\n') do
    ...

不应该匹配\r\n\r\n 4次吗?因为\r\n匹配了两次?或者你基本上是在尝试匹配新行前后的所有内容吗?我在尝试匹配新行之间的内容。我一点也不在乎(那种)新线。我关心他们之间的关系,以及所说的“比赛”的起始位置。还可以看到问题顶部的初始gmatch()模式;它弄乱了项目开始的索引,因为在Windows情况下2个字节变为1,如果我将其转换为Linux替代方案,1个字节变为2。但是,将
“\r\n”
附加到s和
gmatch(([^\r\n]*)\r\n”)
似乎适用于我的Windows案例,尽管我必须在接受问题之前对其进行深入测试。我认为Linux兼容性的最佳解决方案是创建模式变量,并使用一个函数在视线之外附加额外的终止符。如果无法规范换行符,则可以检测正在使用的换行符方案,并为每个方案使用不同的模式,或者使用支持替换的更强大的正则表达式库,或者只是写一个自定义的lexer。然而,在文本文件中计算特定偏移量的要求极为可疑。听一听解决的实际问题是什么会很有趣的。它不是一个文本文件;字符串是多行编辑控件的内容。由于这些是上下文敏感的,并且需要高度可编写脚本(取决于哪个编辑、什么情况等),这基本上是一个最小的穷人词法,因为像“语句”这样的不同行是唯一存在的真正语法。起始位置使得用户端脚本能够支持自动完成选择等功能;博士完全缺乏设计,滥用标准控制,对此无能为力。我只需要每隔一段时间维护+破解一次。换行混乱是关于文本文件,而不是编辑控件;找出编辑控件用于换行的内容,就完成了。我仍然不知道字符串中的偏移如何帮助您实现自动完成之类的功能。是否通过修改文本并将其填充回编辑控件来实现自动完成?o、 o编辑控件是否没有面向行的API?这个UI是用什么实现的?
s = normalize_eols(s) .. '\n'
for line in s:gmatch('([^\n]*)\n') do
    ...