【发布时间】: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,那么获取单独数字的唯一方法是使用此(?<=bli,)\s+((?:(?:(?<!\S)|\s+)[\-\+\d\.eE]+)+)匹配然后拆分组1 在空格上,或者使用\S+获取所有匹配项,这与拆分相同。
标签: regex matlab regex-lookarounds regex-group regex-greedy