2017-02-16 68 views

回答

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

或者只是['str2double'](https://www.mathworks.com/help/matlab /ref/str2double.html),假定字符串已知只包含浮點值。 – horchler

+0

非常感謝你@Suever。 'regexp('2.5','\ d + \。?\ d *','match')'精確地工作! – hamideh

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. 然後接着exponant圖案,即是:
    • 'E' 或 'E'(最終接着用 '+' 或 ' - ')和一個或多個數字

模式將在後文支持的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'