Regex 正则表达式的问题

Regex 正则表达式的问题,regex,matlab,Regex,Matlab,如何编写正则表达式以返回网格体积的值?包含此信息的文件打印在下面 Mesh Bounding Box Size 13119.671875 13057.258789 5996.836426 Mesh Bounding Box Diag 19457.128906 Mesh Bounding Box min -6823.634277 -6530.717773 0.000000 Mesh Bounding Box max 6296.037598 6526.541016 5996.83642

如何编写正则表达式以返回网格体积的值?包含此信息的文件打印在下面

Mesh Bounding Box Size 13119.671875  13057.258789  5996.836426
Mesh Bounding Box Diag 19457.128906 
Mesh Bounding Box min -6823.634277  -6530.717773  0.000000
Mesh Bounding Box max 6296.037598  6526.541016  5996.836426
Mesh Surface Area is 373208000.000000
Mesh Volume  is 48660.9190912000000
Mesh Total Len of 2430 Edges is 1946449.875000 Avg Len 801.008179
Mesh Total Len of 2430 Edges is 1946449.875000 Avg Len 801.008179 (including faux edges))
Thin shell (faces) barycenter:  -228.323471  -0.174702  1865.262939
Vertices barycenter  -175.590256   7.494401  2809.697754
我可以使用以下方法获得网格的体积(即
48660.9190912000000
):

\d+[.]*\d+$
但它也匹配所有其他数字。我试过了

(Mesh Volume  is)\w+\d+[.]*\d+$
但它找不到任何匹配项。有人能帮我吗

如果我将编号分组如下,是否可以将卷的值返回为
\1

(Mesh Volume  is)\w+(\d+[.]*\d+)$

我的目标是找到一个在MATLAB
regexp
函数中使用的工作正则表达式。

如果想要获取数字,可以使用捕获组来获取数字,而不是文本

对于示例数据,您可以省略
\w+
,因为紧跟在
后面的数字是

请注意,您尝试的模式
\d+[.]*\d+$
也可能与
1..1
匹配。当没有点时,由于两次
\d+
,它至少需要两位数字

您可以使用:

Mesh Volume  is (\d+(?:\.\d+)?)
解释

  • 网格体积为
    按字面匹配
  • 捕获组1
    • \d+
      匹配1+个数字
    • (?:\。\d+)
      可选
      匹配一个点,后跟1+位
  • 关闭第1组

您可以尝试以下方法:

%float_pattern = "[0-9.]+";
float_pattern = "\d+(?:\.\d+)?";
pattern = "Mesh Volume  is (?<MeshVolume>" + float_pattern + ")";

matches = regexp(information, pattern, 'match')
tokens = regexp(information, pattern, 'tokens')
names = regexp(information, pattern, 'names')

if isfield(names, "MeshVolume")
    fprintf("Mesh Volume = %f m^3\n", names.MeshVolume);
else
    fprintf("Failed to find mesh volume.\n");
end
%float_pattern=“[0-9.]+”;
float\u pattern=“\d+(?:\。\d+”;
pattern=“网格体积为(?“+float\u pattern+”);
matches=regexp(信息、模式、“匹配”)
tokens=regexp(信息、模式、“tokens”)
names=regexp(信息、模式、“名称”)
if isfield(名称,“MeshVolume”)
fprintf(“网格体积=%f m^3\n”,名称.MeshVolume);
其他的
fprintf(“未能找到网格卷。\n”);
结束
您可以按如下方式使用。还请注意

  • 小数点是
    \.
    ,而不是
  • 我用你原来的正则表达式作为基。如果是负数,或者小数点前没有数字,则该操作将失败
Matlab中的代码:

s = 'Mesh Surface Area is 373208000.000000 Mesh Volume  is 48660.9190912000000'; % example
result = regexp(s, '(?<=Mesh Volume  is )\d+\.?\d+', 'match');
s='网格表面积为373208000.000000网格体积为48660.9190912000000';%例子

result=regexp(s),(?我想您忘了\w是什么。(不是空白)如果输出中没有
,它也会失败。非常有趣的方法。定义
是Matlab特有的还是正则表达式中的标准方法?您能详细说明您的解决方案吗?您可以在一个
regexp
调用中完成此操作,这将更快(IMHO)更可读:
[匹配项、标记、名称]=regexp(信息、模式、“匹配”、“标记”、“名称”);
我认为
fprintf(…%f…)
将失败,因为
%f
是一个数字转换规范,而
names.MeshVolume
中的值仍然是字符串值。请先使用
str2double
转换它。