我想知道regexp
如何用于浮动数字,或者还有其他功能可以做到这一点。
例如,以下内容返回{'2', '5'}
而不是{'2.5'}
。
nums= regexp('2.5','\d+','match')
答案 0 :(得分:5)
正则表达式是用于低级文本解析的工具,它们没有数值数据类型的概念。如果要分析小数,则需要考虑哪些字符组成十进制数并设计正则表达式以显式匹配所有这些字符。
您的示例仅返回'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');
答案 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
基本上上面的模式说:
模式稍后在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'