如何将正则表达式与动态文本组件相匹配



我需要匹配一个正则表达式,该表达式包含来自变量的文本组件。

变量中包含的字符向量很长,可能包含Matlab正则表达式引擎中的运算符、量词、元字符等字符。

有没有办法按原样匹配该文本组件?

使用strfind()是不理想的,因为我想要的匹配包括文本组件之前的一些模式、文本组件的精确匹配以及之后的一些模式。文本本身可以匹配,但前后匹配组件会很不方便。

一个例子(不一定能完全捕捉到不便(是:

pat_b='%%s+(?<name1>abcd{6})s+'; % pattern before
txt='asdf(1).qwer=[123:456,789]; zxcv;'; % text from variable
pat_a='s+%%s+(?<name2>w{6})'; % pattern after

我试过使用

f_txt=@()txt;
expression=[pat_b,'(??@f_txt())',pat_a];
regexp(txt_to_search,expression,'names'),

但无法找到正确的匹配。最有可能的是,读取f_txt()的结果时没有转义特殊字符。

对于这种情况,有两种方法可以使用pattern功能:

  1. 使用strfind((返回字符串中匹配项的位置
  2. 使用extract((返回字符串中的匹配文本

pattern功能允许您为strfind((、extract((和其他函数创建复杂的匹配需求。以下是使用问题示例的简化版本的示例:

% a regex at start
pat_b = 'abs[A-Z]';
% exact text in the middle with random characters
txt = '-&*s%%8';
% a regex at the end
pat_a = '[a-z]{2,4}';

% create a "pattern" from the three parts
pat = regexpPattern(pat_b) + txt + regexpPattern(pat_a);

% create test strings for matching
str1 = "asdfjkl;ab C-&*s%%8def";
str2 = "asdfjkl;ab C-&*s%%8wxyz";
% the test string will include two matches
str = "qwer12" + str1 + "09uiop" + str2;

% Method 1: use strfind() with the pattern
%  Finds two matches and returns the start index(es) in the string
strfind(str,pat)

ans =

15    44    

% Method 2: use extract() with the pattern
%  Finds two matches and returns the matching text in a string array
extract(str,pat)

ans = 

2×1 string array

"ab C-&*s%%8def"
"ab C-&*s%%8wxyz"

如果不匹配,两个方法都返回一个空值,因此可以使用isempty((测试匹配。这两种方法都不修改输入字符串,因此可以组合使用它们。

请注意,patternextract()等相关函数是一种新的ish Matlab功能,在R2020b版本中引入,因此这些方法在早期版本中不起作用。

相关内容

  • 没有找到相关文章

最新更新