java模式和匹配:格式化文本文件
我正在尝试获取一个如下所示的输入文件:
一些元素1 |一些元素具有不同的长度2 |一些元素3 |一个元素4 |一些元素5| 元素1 |不同长度2 |元素3 | AnElementI'llIgnore4 |元素5|
并将其格式化为具有特定间距的列。我对java非常陌生,并且来自C++背景。不管怎样,我一直在考虑用正则表达式建立一个模式,然后寻找匹配项。我不确定正则表达式中用于标识特定字符(管道“|”)的语法是什么,以便确定模式
这似乎是一个好方法吗?如果是的话,模式的语法是什么。compile(“Regex语法”)是,我如何确定与之匹配
# 1 楼答案
如果可以将文件内容作为字符串读取,则可以执行以下任一操作:
直接用一定数量的空格替换“|”:
stringContents.replaceAll("\\|", " ")
在“|”处拆分字符串:
stringContents.split("\\|");
请记住,“|”是正则表达式中的一个特殊字符,被解释为“或”操作,这就是为什么需要用反斜杠(即两个反斜杠)对其进行转义的原因
# 2 楼答案
你可以用绳子。split(stringregex)方法
# 3 楼答案
为什么不直接使用String.split()?e、 g
(注意
split()
方法需要一个regexp,因此必须转义管道)然后,您可以遍历结果数组并使用String.format()以填充/格式化等方式输出
# 4 楼答案
我认为最简单的事情是:
将每行转换为一个带有字符串的数组。拆分(“|”)
创建一个包含每列长度的整数数组
创建StringBuilder以保存重新格式化的行
从第1行循环遍历数组,将每个字符串填充到第2行数组的长度,然后将其附加到StringBuilder
如果字段可能有一个嵌入式管道,因此您必须有一些转义它们的机制,那么您必须自己编写代码来解析列,而不是split()。我想你可以为此编写一个正则表达式,但我认为这比在字符间循环寻找管道要复杂得多
# 5 楼答案
不要重新发明轮子。使用ApacheCommons Lang并检查StringUtils
我假设您想要固定长度的列;该库提供了leftPad()或rightPad()方法以及一堆其他字符串操作
简言之:
String.split()
进行拆分StringUtils
重新格式化