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

标签 java regex

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

 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/

相关文章:

java - 在 Java 中应用此正则表达式

java - If,Else 语句跳过第二个条件

regex - 获取 Scala 中正则表达式匹配的索引

regex - 在vim,正则表达式中清空文件中的所有方法?

java - 空安全 boolean 表达式评估

java - 通过ajax请求将事件添加到与spring MVC集成的fullCalendar

用于验证逗号分隔的 IPv4 和 cidr 的正则表达式

java - 如何在Java中使用正则表达式提取HTML <td>标签数据?

javascript - 匹配带有 [ 字符的行,但如果它有 ] 字符则不匹配

java - 在 Linux 上设置 PATH 环境变量