正则表达式中的令牌

介绍

正则表达式中使用的括号不仅将该表达式的元素组合在一起,而且还将为该组找到的任何匹配指定为令牌.您可以使用标记来匹配同一文本的其他部分。使用令牌的一个优点是它们能记住它们匹配的内容,因此您可以在搜索或替换过程中回忆和重用匹配的文本。

表达式中的每个标记都被分配了一个数字,从1开始,从左到右。要在表达式的后面引用一个令牌,请使用反斜杠后跟令牌编号来引用它。例如,当引用表达式中第三组括号生成的令牌时,使用\ 3

举个简单的例子,如果希望在字符数组中搜索相同的连续字母,可以捕获第一个字母作为标记,然后立即搜索匹配的字符。在下面的表达式中,(\ S)Phrase在任何时候创建一个令牌正则表达式匹配字符数组中的任何非空格字符。这个表达的第二部分,“\ 1”,在第一个字符的后面查找第二个相同字符的实例。

坡= [“当我点头,几乎是打盹的时候,”...突然传来敲门声,];(垫、托托,ext) = regexp(坡,“(\ S) \ 1”“匹配”...“令牌”“tokenExtents”);垫
Mat = 1×4 cell array {'dd'} {'pp'} {'dd'} {'pp'}

细胞数组托托包含单元格数组,每个单元格数组包含一个令牌。

托托{:}
Ans = 1×1 cell array {'d'} Ans = 1×1 cell array {'p'} Ans = 1×1 cell array {'d'} Ans = 1×1 cell array {'p'}

细胞数组ext包含数字数组,每个数组包含令牌的起始和结束索引。

ext {:}
Ans = 11 11 Ans = 26 26 Ans = 35 35 Ans = 57 57

另一个示例,捕获匹配的HTML标记对(例如,<一>< / >)和他们之间的文本。这个例子中使用的表达式是

expr =' < (\ w +)。* ? >。* ?< 1 > / \ '

表达式的第一部分,' < (\ w +) ',匹配左尖括号(<),后跟一个或多个字母、数字或下划线字符。括起来的圆括号捕获在开始尖括号之后的标记字符。

这个表达的第二部分,”。* ? >。* ?”,匹配该HTML标记的其余部分(直到>),以及可能在下一个左尖括号之前的任何字符。

最后一部分,' < 1 > / \ ',匹配结束HTML标记中的所有字符。这个标签由序列组成< / >标记,在那里标签是作为标记捕获的任何字符。

hstr =“< !评论> <名称= " 752507 " > < / > < b >默认< / b > < br > ';expr =' < (\ w +)。* ? >。* ?< 1 > / \ ';[mat,tok] = regexp(hstr, expr,)“匹配”“令牌”);垫{:}
ans = ' <名称= " 752507 " > < / > ' ans = < b > < / b >违约的
托托{:}
Ans = 1×1 cell array {'a'} Ans = 1×1 cell array {'b'}

多个令牌

下面是一个如何给令牌赋值的示例。假设您要搜索以下文本:

安迪泰德鲍勃吉姆安德鲁安迪泰德马克

您可以选择使用以下搜索模式搜索上述文本:

和(y |奖赏)| (t) e (d)

这个模式有三个生成标记的括号表达式。当您最终执行搜索时,将为每个匹配生成以下令牌。

匹配

令牌1

令牌2

安迪

y

泰德

t

d

安德鲁

报答

安迪

y

泰德

t

d

只使用最高层的括号。例如,如果搜索模式和(y |报酬)发现的文本安德鲁,令牌1被赋值报答.但是,如果搜索模式(和(y |报酬)使用时,令牌1被赋值安德鲁

无与伦比的令牌

对于正则表达式中指定的在正在计算的文本中没有匹配的标记,正则表达式regexpi返回空字符向量()作为令牌输出,以及一个区段,该区段标记了期望令牌在字符串中的位置。

执行这里所示的示例正则表达式指定从MATLAB返回的路径的字符向量®tempdir函数。正则表达式expr包括6个令牌说明符,每段路径对应一个令牌说明符。第三个说明符[a - z] +在字符向量中没有匹配,因为这部分路径,配置文件,以大写字母开头:

装备= tempdir
装备= ' C: \ WINNT \ Profiles \ bpascal \当地人~ 1 \ Temp \ '
expr = [”([a - z]:) \ \ (WINNT) \ \ [a - z] +) ?。* \ \ '...”([a - z] +) \ \ [a - z] + ~ \ d) \ \(临时)\ \ '];[tok, ext] = regexp(chr, expr,“令牌”“tokenExtents”);

当在文本中找不到标记时,正则表达式返回空字符向量()作为标记和具有标记区段的数字数组。区段的第一个数字是标记标记的字符串索引,区段的第二个数字比第一个数字小1。

在本例中,空令牌是表达式中指定的第三个令牌,因此返回的第三个令牌为空:

托托{:}
ans = 1×6单元阵列{' C:}{的WINNT}{0×0字符}{‘bpascal}{'当地人~ 1 '}{“临时”}

在变量中返回的第三个令牌范围ext初始索引设置为10,这是非匹配项,配置文件,始于道路。结束区段索引设置为比开始区段索引小1,即9:

ext {:}
Ans = 1 2 4 8 10 9 19 25 27 34 36 39

替换文本中的令牌

在替换文本中使用令牌时,使用$1$2等而不是\ 1\ 2等。本示例捕获两个令牌并颠倒它们的顺序。第一,$1,是“诺玛珍”第二,$2,是“贝克”.请注意,regexprep返回修改后的文本,而不是初始索引向量。

regexprep (诺玛珍贝克的”(\ w + \ s \ w +) \年代(\ w +)2美元,1美元
ans = 'Baker, Norma Jean'

名叫捕获

如果您在表达式中使用了很多令牌,那么为它们分配名称可能会有帮助,而不必跟踪哪个令牌编号分配给哪个令牌。

在表达式中引用命名标记时,请使用语法\ k <名称>而不是数字\ 1\ 2等。

坡= [“当我点头,几乎是打盹的时候,”...突然传来敲门声,];正则表达式(坡,‘(? < anychar >)。\ k < anychar >”“匹配”
Ans = 1×4 cell array {'dd'} {'pp'} {'dd'} {'pp'}

命名标记在标记MATLAB正则表达式函数的输出时也很有用。在处理许多文本时尤其如此。

例如,从几个字符向量中解析街道地址的不同部分。为表达式中的每个标记分配一个简短的名称:

chr1 ='134 Main Street, Boulder, CO, 14923';chr2 ='26 Walnut Road, Topeka, KA, 25384';chr3 ='847 Industrial Drive, Elizabeth, NJ, 73548';p1 =药物不良反应”(? < > \ d + \ \ s + \年代(| | |街大道道路))”;p2 =‘(? <城市> [a - z] [a - z] +)”;p3 =‘(? <国家> [a - z]{2})”;p4 =‘(? < zip > \ d{5})”;expr = [p1”、“p2”、“p3”、“p4);

如以下结果所示,您可以通过使用命名令牌使输出更容易使用:

Loc1 = regexp(cr1, expr,)“名字”
loc1 = struct with fields: adrs: '134 Main Street' city: 'Boulder' state: 'CO' zip: '14923'
Loc2 = regexp(cr2, expr,)“名字”
loc2 = struct with fields: adrs: '26 Walnut Road' city: 'Topeka' state: 'KA' zip: '25384'
Loc3 = regexp(cr3, expr,)“名字”
loc3 = struct with fields: adrs: '847 Industrial Drive' city: 'Elizabeth' state: 'NJ' zip: '73548'

另请参阅

||

相关的话题