0

你可以在这里测试一切:

我想提取单个变量的值,注意它们定义的不同方式。例如,对于 dtime,我们要提取 0.004。它还必须能够解释指数数字,例如对于变量 vis,它应该提取 10e-6。

问题是每个变量在变量名和等号之间都有自己的空格数(我无法控制它们的编码方式)

要测试的文本:

dtime = 0.004D0

案例 = 0

新运行 = 1

周期性 = 0

标量 = 1

伊迪= 1

mg_level = 5

nstep = 20000

可见 = 10e-6

ak = 10e-6

g = 9.81D0

要提取 dtime 的值,此 REGEX 有效:

(?<=dtime    =\s)[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?

要提取 dtime 的值,此 REGEX 有效:

(?<=vis         =\s)[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?

问题是我需要知道变量名和等号之间的确切空格数。我尝试使用 \s+ 但它不起作用,为什么?

(?<=dtime\s+=\s)[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?
4

2 回答 2

1

如果您使用的是 PHP 或 PERL 或更一般的 PCRE,那么您可以使用该\K标志来解决此问题,如下所示:

dtime\s+=\s\K[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?
           ^^
        Notice the \K, it tells the expression to ignore everything
        behind it as if it was never matched

正则表达式 101 演示

编辑:我认为如果您不能使用后视或消除匹配的内容,则需要捕获捕获组中的数字:

dtime\s*=\s*([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)
于 2013-09-12T18:08:38.873 回答
1

(?<=dtime\s+=\s) 是一个可变长度的后视,因为 \s+。大多数(不是全部)引擎仅支持“固定”长度的后视。

此外,您的正则表达式在指数形式之前需要一个数字,因此如果没有数字,它将不匹配。这样的事情可能会奏效-

 # dtime\s*=\s*([-+]?[0-9]*\.?[0-9]*(?:[eE][-+]?[0-9]+)?)

 dtime \s* = \s* 
 (                                     # (1)
      [-+]? [0-9]* \.? [0-9]* 
      (?: [eE] [-+]? [0-9]+ )?
 )

编辑:经过审查,我看到您正在尝试将多个可选表单折叠到一个正则表达式中。
我认为这并不是那么直截了当。就像兴趣因素一样,这可能是一个基线:

 # dtime\s*=\s*([-+]?(?(?=[\d.]+)(\d*\.\d+|\d+\.\d*|\d+|(?!))|)(?(?=[eE][-+]?\d+)([eE][-+]?\d+)|))(?(2)|(?(3)|(?!)))

 dtime \s* = \s* 
 (                         # (1 start)
      [-+]?                     # optional -+

      (?(?=                     # conditional check for \d*\.\d*
           [\d.]+ 
        )
           (                         # (2 start), yes, force a match on one of these
                \d* \. \d+                #  \. \d+
             |  \d+ \. \d*                #  \d+ \.
             |  \d+                       #  \d+
             |  (?!)                      # or, Fail the match,  the '.' dot is there without a number
           )                         # (2 end)
        |                            # no, match nothing

      )
      (?(?=                     # conditional check for [eE] [-+]? \d+
           [eE] [-+]? \d+ 
        )
           ( [eE] [-+]? \d+ )        # (3), yes, force a match on it
        |                            # no, match nothing
      )

 )                         # (1 end)
 (?(2)                     # Conditional check - did we match something? One of grp2 or grp3 or both
   |  (?(3)
        |  (?!)                      # Did not match a number, Fail the match
      )
 )
于 2013-09-12T18:34:16.433 回答