gpt4 book ai didi

java - 用于解析格式化数字的正则表达式

转载 作者:行者123 更新时间:2023-12-04 07:04:28 26 4
gpt4 key购买 nike

我正在解析包含大量格式化数字的文档,例如:

 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 = 小数点后 n 位的 m 个字符的浮点数):
 (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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com