【问题标题】:RegEx for capturing scientific numbers in MATLAB用于在 MATLAB 中捕获科学数字的 RegEx
【发布时间】:2019-10-11 21:33:13
【问题描述】:

我的印象是,我会以一种更优雅、更紧凑的方式使用正则表达式解析数字。我知道如何解析多种格式的数字,

str_expr = '[\-\+\d\.E]+';
fruit    = regexp(str_text, str_expr, 'match')

而且我知道如何看后面,

(?<=test)expr

但是,如果我想在某些后视“测试”之后匹配多个数字怎么办?我通常在两个正则表达式中执行此操作,一个用于查看后面,第二个用于解析数字。例如:

str_text = 'bla, ble,... bli, 1     -0.1243E-02    23.123E+03'

% pre-digest: look behind
str_reg1 = '(?<=bli,).*'
fruit    = regexp(str_text, str_reg1, 'match')

% parse numbers
str_reg2 = '[\-\+\d\.E]+'
fruit    = regexp(fruit{1}, str_reg2, 'match')

如果我尝试一步完成,我只会捕捉到第一个数字

% 1st try..
str_reg_try1 = '(?<=bli,)[\-\+\d\.E]+'
fruit        = regexp(fruit{1}, str_reg_try1, 'match')

% 2nd try..
str_reg_try2 = '(?<=bli,)([\-\+\d\.E]+)+'
fruit        = regexp(fruit{1}, str_reg_try1, 'tokens')

我该如何解决这个问题?

【问题讨论】:

  • 当然,考虑上面例子的输入,str_text = 'bla, ble,... bli, 1, -0.1243E-02, 23.123E+03' 而且你要输出解析三个不同格式的数字 1, -0.1243E-02, 23.123E+03,不是一个完整的字符串,而是一个数字,所以“fruit”产生:>>> [1] [-0.1243E-02] [23.123E+03]
  • 你们的matlab工具支持PCRE吗?如果是这样,请尝试使用\G\K 进行重置,如this pattern。其实两步没什么问题,因为它更容易阅读 =D 不是吗。
  • 您需要 1 个匹配项中的数字 1 -0.1243E-02 23.123E+03 还是单独匹配项中的数字 [1 , -0.1243E-02 , 23.123E+03]
  • Matlab regex engine 不支持\G 运算符。
  • 如果您的引擎不支持\G 构造PCRE,Perl,Boost,etc 并且不是Dot-Net,那么获取单独数字的唯一方法是使用此(?&lt;=bli,)\s+((?:(?:(?&lt;!\S)|\s+)[\-\+\d\.eE]+)+) 匹配然后拆分组1 在空格上,或者使用\S+ 获取所有匹配项,这与拆分相同。

标签: regex matlab regex-lookarounds regex-group regex-greedy


【解决方案1】:

如果我的猜测可能很接近,那么在这里,我们正在寻找收集数字。我很肯定我们可能希望在将字符串传递给 RegEx 引擎之前将其分成两个或更多部分:

bla, ble,... bli,
1     -0.1243E-02    23.123E+03

那么,在这种情况下,我们甚至可能不需要正则表达式。


或者我们可能只想整合一些简单的表达式,例如:

(.+?bli,)|([0-9-E.\-+]+)

Demo

另外,我认为评论中bobble bubble 的建议是一个更好的选择(link):

(?:\G(?!^)|bli,)\s+\K[-+\d.E]+

正则表达式

如果不需要此表达式,可以在 regex101.com 中修改或更改它。

正则表达式电路

jex.im 可视化正则表达式:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多