我正在解析包含大量格式化数字的文档,例如:
Frc consts -- 1.4362 1.4362 5.4100
IR Inten -- 0.0000 0.0000 0.0000
Atom AN X Y Z X Y Z X Y Z
1 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
2 1 0.40 -0.20 0.23 -0.30 -0.18 0.36 0.06 0.42 0.26
这些是分隔行,全部带有重要的前导空格,并且可能有或可能没有重要的尾随空格)。它们由 72,72, 78, 78 和 78 个字符组成。我可以推断出领域之间的界限。这些是可描述的(使用 Fortran 格式(nx = nspaces,an = n alphanum,in = n 列中的整数,fm.n = m 个字符的 float ,小数点后有 n 位):
(1x,a14,1x,f10.4,13x,f10.4,13x,f10.4)
(1x,a14,1x,f10.4,13x,f10.4,13x,f10.4)
(1x,a4,a4,3(2x,3a7))
(1x,2i4,3(2x,3f7.2))
(1x,2i4,3(2x,3f7.2))
我可能有数千种不同的格式(我可以自动生成或外包),并通过描述组件的正则表达式来描述它们。因此,如果 regf10_4 表示满足 f10.4 约束的任何字符串的正则表达式,我可以创建以下形式的正则表达式:
COMMENTS
(\s
.{14}
\s
regf10_4,
\s{13}
regf10_4,
\s{13}
regf10_4,
)
我想知道是否有正则表达式可以满足这种方式的重用。计算机和人类创建兼容数字的方式有很多种,比如 f10.4。我相信以下都是 fortran 的合法输入和/或输出(我不需要像 12.4f 中那样的 f 或 d 形式的后缀)[SO 中的格式应该被解读为第一个没有前导空格,第一个没有前导空格第二等]
-1234.5678
1234.5678
// missing number
12345678.
1.
1.0000000
1.0000
1.
0.
0.
.1234
-.1234
1E2
1.E2
1.E02
-1.0E-02
********** // number over/underflow
它们必须对相邻字段的内容具有鲁棒性(例如,仅检查精确位置中的 10 个字符。因此,以下内容对于 (a1,f5.2,a1) 是合法的:
a-1.23b // -1.23
- 1.23. // 1.23
3 1.23- // 1.23
我使用 Java,因此需要与 Java 1.6 兼容的正则表达式构造(例如,不是 Perl 扩展)
最佳答案
据我了解,每一行都包含一个或多个固定宽度的字段,其中可能包含标签、空格或不同类型的数据。如果您知道字段的宽度和类型,则提取其数据是一个简单的问题:substring()
、trim()
和(可选)Whatever.parseWhatever ()
。正则表达式不能使这项工作变得更容易——事实上,它们所能做的就是让它变得更加困难。
扫描仪也没什么帮助。确实,它为各种值类型预定义了正则表达式,并且为您进行转换,但仍然需要告诉它每次要查找哪种类型,并且需要用它可以识别的分隔符分隔字段。根据定义,固定宽度数据不需要分隔符。您可以通过预先查找行中应保留的字符数来伪造分隔符,但这只是使工作变得比实际需要更困难的另一种方式。
听起来性能将成为一个主要问题;即使您可以使正则表达式解决方案发挥作用,它也可能会太慢。并不是因为正则表达式本质上很慢,而是因为您必须经历一些扭曲才能使它们适应问题。我建议你忘记这项工作的正则表达式。
关于java - 用于解析格式化数字的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1333150/