2

I would like regex(es) that can parse right-justified numeric values in a fixed length field with optional leading whitespace. (This is essentially FORTRAN output but there are many other tools that do this). I know the width of the field.

Assume the field is an integer of width 5 (I5). Then the following are all conformant numeric values:

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

I can make no assumption about the previous and following fields. Thus the following is valid for I3,I5,I2:

"-121234512"

and yields the values -12, 12345 and 12.

There should be no additional code associated with the regex. I am using Java regex but I would like this to be fairly general (at least conformant with C#).

If this can be done for integers, I would also like the regex(es) for real numbers which include a decimal point, e.g. F10.3

"   -12.123"

2 Answers 2

5

The regex:

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

matches all of your examples:

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

And chaining them in groups:

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

on the input:

-121234512

matches:

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

A short explanation:

(?=        # 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

As you can see, the lookahead forces the order of the characters (spaces before digits and/or minus sign, minus sign before digits).

And a version for you float example might look like:

(?=[ ]*-?\d+(\.\d+)?)[ -\d.]{10}
Sign up to request clarification or add additional context in comments.

Comments

0

You can use the regex:

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

Rubular link

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.