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

o4hqfura  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(182)

我需要匹配一个正则表达式,它包含一个来自变量的文本组件。
变量中包含的字符向量很长,并且可以包含作为运算符、量词、元字符等的字符,这些字符在MatLab的正则表达式引擎中。
有没有办法按原样匹配该文本组件?
使用strfind()并不理想,因为我想要的匹配包括文本组件之前的一些模式、文本组件的精确匹配以及文本组件之后的一些模式。文本可以自己匹配,但匹配前后的组件会很不方便。
举个例子(不一定能完全反映其不便之处):

pat_b='%%\s+(?<name1>abc\d{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()的结果时没有转义特殊字符。

2admgd59

2admgd591#

有两种使用pattern功能的方法来解决这种情况:
1.使用strfind()返回字符串中匹配的位置
1.使用extract()以字符串形式返回匹配文本
pattern特性允许您为strfind()、提取()和其他函数创建复杂的匹配需求。以下是使用问题示例的简化版本的示例:

% a regex at start
    pat_b = 'ab\s[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())是在R2020b版本中引入的一种新功能,因此这些方法在早期版本中不起作用。

相关问题