我想知道如何使用regexp
浮點數或有任何其他功能來做到這一點。正則表達式相當於matlab浮點數
例如,以下返回{'2', '5'}
而不是{'2.5'}
。
nums= regexp('2.5','\d+','match')
我想知道如何使用regexp
浮點數或有任何其他功能來做到這一點。正則表達式相當於matlab浮點數
例如,以下返回{'2', '5'}
而不是{'2.5'}
。
nums= regexp('2.5','\d+','match')
正則表達式是一種用於低級別文本解析的工具,它們沒有數字數據類型的概念。如果你想分析小數,你需要考慮什麼字符組成一個十進制數,並設計一個正則表達式來顯式匹配所有這些字符。
您的示例僅返回'2'
和'5'
,因爲您的模式僅匹配數字(\d
)的字符。要處理十進制數字,您需要在您的模式中明確包含.
。以下將匹配任意數字的數字,後跟小數點後的0或1個小數點以及0個或更多數字。
regexp('2.5', '\d+\.?\d*', 'match')
這是假設你永遠擁有國內領先的數字(即不'.5'
)
或者,您也可以考慮使用像textscan
或sscanf
代替的東西來分析你的字符串,將是更穩健比自定義正則表達式,因爲他們知道不同的數字數據類型。
C = textscan('2.5', '%f');
C = sscanf('2.5', '%f');
如果字符串只有包含此浮點數,你可以只使用str2double
val = str2double('2.5');
@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
基本上圖案說:
模式將在後文支持的Inf
,+Inf
完成,-Inf
和NaN
,不區分大小寫。最後,爲了獲取目的,在(
和)
之間包含了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'
或者只是['str2double'](https://www.mathworks.com/help/matlab /ref/str2double.html),假定字符串已知只包含浮點值。 – horchler
非常感謝你@Suever。 'regexp('2.5','\ d + \。?\ d *','match')'精確地工作! – hamideh