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(
匹配1+个数字\d+
可选(?:\。\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”);
结束
您可以按如下方式使用。还请注意
- 小数点是
,而不是\.
- 我用你原来的正则表达式作为基。如果是负数,或者小数点前没有数字,则该操作将失败
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
转换它。