正则表达式匹配中的换行符问题

动作开发 · 1773 次浏览
Bobo_alcazar 创建于 2023-05-22 02:39

根据系统和文本编辑器的不同,换行的标识符往往有CR LRCRLF三种写法。在计算机时代,这三种写法所表达的意义是完全相同的,从不用来区别文本意义,仅仅是不同软件有不同选择而已。因此,很多计算机语言或计算机程序在处理文本/字符串时,都会选择将换行标识符转换成统一的写法再进行处理,以避免一些不必要的麻烦。

而Quicker的提供的正则表达式似乎未作如此处理,而是将三者处理成了三个不同的字符串。比如以下这段文字:

AAA

BBB

竟然出现了无法被^[\S\s]+\n+[\S]+$匹配的情况。由于无法预知文本环境,必须要写成^[\S\s]+[\r\n]+[\S]+$才比较保险,保证各种情况都能匹配。这不仅没必要,还很容易造成麻烦。建议将三者视为同一符号来处理。

CL 最后更新于 2023/5/22

回复内容
CL 2023-05-22 07:39
#1

这是底层规则,并不适合在quicker里做修改。

如果需要,可以在前面加一个步骤将所有符号统一一下,将"\r\n"和"\r"都替换成"\n"。


Bobo_alcazar 回复 CL 2023-05-22 22:46 :

连Python这种编程语言的open()函数都有universal new line模式,而且是默认开启的,即读入文本中无论CR LRCR还是LF都自动转成LF。Quicker作为一个低代码平台总不至于比编程语言还要底层吧,做这样的统一处理是完全可能而且有很大好处的。

Bobo_alcazar 最后更新于 2023-05-22 22:48
zryan 回复 Bobo_alcazar 2023-05-23 13:39 :

暂时没见过什么语言的正则表达式会把几种换行符自动转换成一种的,Quicker模块是直接调用的C#的正则方法,不加限制可以满足更多的需求。

如果有需要的话,在前面替换和稍改正则都挺方便的。

Bobo_alcazar 回复 zryan 2023-05-23 18:55 :

我不是说Python吗。。。

而且严格来说不是正则,而是在默认状态下,主要被Python存储的字符串,其换行符都仅是\n。

zryan 回复 Bobo_alcazar 2023-05-23 21:59 :

对的,Python是从字符串和读写文件中保证换行符统一为\n,不是在正则这个模块上。而C#不是这样,所以这个是偏底层的东西,不适合在单独一个正则模块上进行修改。

Bobo_alcazar 回复 zryan 2023-05-24 17:13 :

嗯嗯,好的,谢谢。

zetalpha 2023-05-22 22:19
#2

不太可能哦 

Cea 2023-05-23 22:18
#3

从Quicker软件的设计角度来看,Quicker是一款旨在提高效率和灵活性的工具,它允许用户自定义操作以适应各种不同的工作流程。在处理换行符的问题上,Quicker选择了直接调用C#的Regex类,这是一种尊重和接纳底层编程语言设计决策的做法。


C#的Regex类在设计时,保留了对CR、LF和CRLF的区别,这是出于对多平台兼容性和灵活性的考虑。不同的操作系统使用不同的换行符,如果C#将所有的换行符都视为相同,那么它在处理一些特定系统的文件时可能会遇到问题。此外,C#的设计原则之一是尽量避免对用户的假设,而将所有的换行符视为相同就是对用户的一种假设。


Quicker在这个问题上的决策,实际上增加了软件的灵活性,使得用户可以根据自己的需要选择如何处理换行符。这种设计理念是尽可能地提供强大和灵活的功能,而不是对用户的需求做出假设。如果Quicker默认将所有的换行符视为相同,那么它就做出了一个假设,即所有的用户都希望这样。然而,这可能并不总是正确的。有些用户可能希望能够区分不同的换行符,因此,保持这种区别实际上是尊重用户的选择,也是符合Quicker和C#的设计理念的。


最后,如果在使用Quicker时遇到了问题,那么问题的根源可能并不在于Quicker本身,而在于对Quicker和C# Regex类的理解和使用。因此,更好的解决方案可能是熟悉C#的正则表达式语法,而不是改变Quicker的行为。

CL 回复 Cea 2023-05-23 22:48 :

GPT 写的嘛?😂

Cea 回复 CL 2023-05-23 22:50 :

是的🤣

回复主贴