How can I improve my regular expressions?

2 次查看(过去 30 天)
Here are two txt files(frt_susp_sub.txt and rr_susp_sub.txt) and I'd like to extract spring and damper name from each file as shown in the picture below.
This is my code
clc
clear all
str1 = fileread('frt_susp_sub.txt');
frt_spr_assy_xpr = '(?<=SPRING_ASSEMBLY.+?springs.tbl/).+?(?=.spr)';
frt_dpr_assy_xpr = '(?<=DAMPER_ASSEMBLY.+?dampers.tbl/).+?(?=.dpr)';
frt_spr_assy = regexp(str1, frt_spr_assy_xpr, 'match', 'once');
frt_dpr_assy = regexp(str1, frt_dpr_assy_xpr, 'match', 'once');
str2 = fileread('rr_susp_sub.txt');
rr_spr_assy_xpr = '(?<=SPRING_ASSEMBLY.+?springs.tbl/).+?(?=.spr)';
rr_dpr_assy_xpr = '(?<=DAMPER_ASSEMBLY.+?dampers.tbl/).+?(?=.dpr)';
rr_spr_assy = regexp(str2, rr_spr_assy_xpr, 'match', 'once');
rr_dpr_assy = regexp(str2, rr_dpr_assy_xpr, 'match', 'once');
It works well as I expected but the performance is pretty bad.
How can I improve my code?

采纳的回答

Stephen23
Stephen23 2023-10-30
编辑:Stephen23 2023-10-30
Get rid of the look-behind expressions. They don't restrict which block of data is being read anyway.
Also note that '.' matches any character, whereas '\.' matches a period character only.
Also get rid of cargo-cult CLC and CLEAR ALL.
str1 = fileread('frt_susp_sub.txt');
frt_spr_assy = regexp(str1, '\w+(?=\.spr)', 'match', 'once')
frt_spr_assy = 'name13'
frt_dpr_assy = regexp(str1, '\w+(?=\.dpr)', 'match', 'once')
frt_dpr_assy = 'name14'
It may be faster to avoid the look-ahead:
tmp = regexp(str1, '(\w+)\.spr', 'tokens', 'once');
frt_spr_assy = tmp{1}
frt_spr_assy = 'name13'

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Variables 的更多信息

产品


版本

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by