我需要匹配一个正则表达式,该表达式包含来自变量的文本组件。
变量中包含的字符向量很长,可能包含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
功能:
- 使用strfind((返回字符串中匹配项的位置
- 使用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((测试匹配。这两种方法都不修改输入字符串,因此可以组合使用它们。
请注意,pattern
和extract()
等相关函数是一种新的ish Matlab功能,在R2020b版本中引入,因此这些方法在早期版本中不起作用。