Regexp等效于matlab中的浮点数

时间:2017-02-16 20:06:09

标签: matlab

我想知道regexp如何用于浮动数字,或者还有其他功能可以做到这一点。

例如,以下内容返回{'2', '5'}而不是{'2.5'}

nums= regexp('2.5','\d+','match')

2 个答案:

答案 0 :(得分:5)

正则表达式是用于低级文本解析的工具,它们没有数值数据类型的概念。如果要分析小数,则需要考虑哪些字符组成十进制数并设计正则表达式以显式匹配所有这些字符。

您的示例仅返回'2''5',因为您的模式仅匹配数字(\d)的字符。要处理十进制数,您需要在模式中明确包含.。以下内容将匹配任意数字的数字,后跟0或1个小数点以及小数点后的0或更多数字。

regexp('2.5', '\d+\.?\d*', 'match')

这假设您总是有一个前导数字(即不是'.5'

或者,您可以考虑使用类似textscansscanf的内容来解析您的字符串,这将比自定义正则表达式更强大,因为它们知道不同的数值数据类型。

C = textscan('2.5', '%f');
C = sscanf('2.5', '%f');

如果您的字符串包含此浮点数,则可以使用str2double

val = str2double('2.5');

答案 1 :(得分:1)

@Suever的答案已被接受,无论如何这里有一些更完整的答案应该接受各种浮点语法(默认情况下包括NaN和+/- Inf):

% Regular expression for capturing a double value
function [s] = cdouble(supportPositiveInfinity, supportNegativeInfinity, 
supportNotANumber)
%[
    if (nargin < 3), supportNotANumber = true; end
    if (nargin < 2), supportNegativeInfinity = true; end
    if (nargin < 1), supportPositiveInfinity = true; end

    % A double
    s = '[+\-]?(?:(?:\d+\.\d*)|(?:\.\d+)|(?:\d+))(?:[eE][+\-]?\d+)?'; %% This means a numeric double

    % Extra for nan or [+/-]inf
    extra = '';
    if (supportNotANumber), extra = ['nan|' extra]; end
    if (supportNegativeInfinity), extra = ['-inf|' extra]; end
    if (supportPositiveInfinity), extra = ['inf|\+inf|' extra]; end

    % Adding capture
    if (~isempty(extra))
        s = ['((?i)(?:', extra, s, '))']; % (?i) => Locally case-insensitive for captured group
    else
        s = ['(', s, ')'];
    end    
%]
end

基本上上面的模式说:

  1. 最后以“+”或“ - ”开头
  2. 开头
  3. 然后是其中之一
    • 一个或多个数字后跟一个点,最后是零到多个数字
    • 一个点后跟一个或多个数字
    • 仅限一位或多位数字
  4. 然后是指数模式,即:
    • 'e'或'E'(最后跟'+'或' - ')和一个或多个数字
  5. 模式稍后在Inf+Inf-InfNaN支持的情况下以不区分大小写的方式完成。最后,在()之间包含了everthing以用于捕获目的。

    以下是一些在线测试示例:https://regex101.com/r/K87z6e/1

    或者你可以在matlab中测试:

    >> regexp('Hello 1.235 how .2e-7 are INF you +.7 doing ?', cdouble(), 'match')
    
    ans = 
    
        '1.235'    '.2e-7'    'INF'    '+.7'