我有一个由系统生成的CSV文件。问题在于其中一个字段曾经是一个项目列表。原始列表的一个例子如下......
The serial number of the desk is 45TYTU
This is the second item in the list
The colour of the apple is green
The ID code is 489RUI
This is the fourth item in the list.
不幸的是,系统吐出了下面的代码......
The serial number of the desk is 45TYTUThis is the second item in the listThe colour of the apple is greenThe ID code is 489RUIThis is the fourth item in the list.
正如你所看到的,它忽略了换行符,只是把所有东西都束起来。我无法修改生成此输出的系统,所以我想要做的是提出某种正则表达式查找和替换将它们分开的表达式。
我的原始版本是尝试检测大写字母是否位于小写字母的中间,但是在示例中的一个项目中,当使用序列号时,它会将其抛出。 / p>
有人有什么建议吗?正则表达式是否可行?
---编辑---
我认为我需要为自己简化一些事情,如果我忽略了以序列号结尾的行将暂时破坏的事实。我需要创建一个表达式,如果它检测到在小写字母之后使用大写字母,则会插入换行符
---编辑2 --- 使用fardjad给出的示例,一切都适用于给出的样本数据,强者是......
(.(?=[A-Z][a-z]))
现在,当我测试更多数据时,我可以看到出现问题,某些行以数字开头,因此它将这些视为序列号,您可以在http://regexr.com?2vfi5
查看此示例在线路的开头只有大约10个已知数字,如240v,120v等......
有没有办法排除这些?
答案 0 :(得分:2)
答案 1 :(得分:1)
你可以搜索这个
(?<=\p{Ll})(?=\p{Lu})
并替换为换行符。正则表达式匹配小写字母\p{Ll}
和大写字母\p{Lu}
之间的空格。
这假设您正在使用支持Unicode的正则表达式引擎(例如,.NET,PCRE,Perl)。如果没有,你可能也会逃避
(?<=[a-z])(?=[A-Z])
但这当然只能检测ASCII字中的低/大写变化。