正则表达式读取固定宽度数字字段

时间:2011-02-25 11:01:33

标签: regex

我希望正则表达式可以解析带有可选前导空格的固定长度字段中的右对齐数值。 (这基本上是FORTRAN输出,但还有许多其他工具可以做到这一点)。我知道场地的宽度。

假设该字段是宽度为5的整数(I5)。然后以下是所有符合的数值:

"  123"
"12345"
"-1234"
"   -1"

我不能对前面和后面的字段做出任何假设。因此,以下内容适用于I3,I5,I2

"-121234512"

并生成值-12, 1234512

应该没有与正则表达式相关的其他代码。我正在使用Java正则表达式,但我希望这是相当普遍的(至少与C#一致)。

如果可以对整数进行此操作,我还希望正则数据包含包含小数点的实数,例如: F10.3

"   -12.123"

2 个答案:

答案 0 :(得分:5)

正则表达式:

(?=[ ]*-?\d+)[ -\d]{5}

匹配您的所有示例:

"  123"
"12345"
"-1234"
"   -1"

将它们分组链接:

((?=[ ]*-?\d+)[ -\d]{3})((?=[ ]*-?\d+)[ -\d]{5})((?=[ ]*-?\d+)[ -\d]{2})

输入:

-121234512

匹配:

$1 = -12
$2 = 12345
$3 = 12

一个简短的解释:

(?=        # start positive look ahead
  [ ]*     #   zero or more space
  -?       #   an optional minus sign
  \d+      #   one or more digits
)          # end positive look ahead
[ -\d]{5}  # spaces, minus sign or digits, exactly 5 times

如您所见,前瞻强制字符的顺序(数字和/或减号前的空格,数字前的减号)。

您的浮动示例可能如下所示:

(?=[ ]*-?\d+(\.\d+)?)[ -\d.]{10}

答案 1 :(得分:0)

您可以使用正则表达式:

^(?= *-?[0-9]*$).{5}

Rubular link