正则表达式中的标记

介绍

在正则表达式使用不仅如此表达的组元素一起,还指定任何匹配括号发现该基团作为令牌。您可以使用标记来匹配同一文本的其他部分。使用令牌的一个好处是它们会记住它们匹配的内容,因此您可以在搜索或替换过程中回忆和重用匹配的文本。

表达式中的每令牌被分配一个号码,从1开始,去从左到右。要对一个令牌在稍后的表达的引用,是指它使用反斜杠后跟令牌数目。例如,在表达式引用由第三组括号生成的令牌时,使用\ 3

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

POE = [“当我打盹,几乎是打盹的时候,”“突然传来了敲击声,”];[垫,TOK,分机] =正规表达式(POE,“(\ S) \ 1”,'比赛',“令牌”,“tokenExtents”);垫
mat = 1×4单元格数组{'dd'} {'pp'} {'dd'} {'pp'}

细胞数组TOK包含单元阵列,每个包含一个令牌。

TOK {:}
ANS = 1×1单元阵列{ 'd'} ANS = 1×1单元阵列{ 'P'} ANS = 1×1单元阵列{ 'd'} ANS = 1×1单元阵列{ 'P'}

细胞数组ext包含数字阵列,每个包含开始和令牌结束的指标。

ext {:}
参考译文:ans = 11 11 ans = 26 26 ans = 35 35 ans = 57 57

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

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

表达式的第一部分,'<(\ W +)',匹配首尖括号(<),后跟一个或多个字母、数字或下划线字符。括括号捕获尖括号后的标记字符。

这个表达的第二部分,'*?>。*?',符合这个HTML标签的剩余部分(字符,直到达到>),以及下一个尖括号前的任何字符。

最后一部分,“< / \ 1 >”匹配结束HTML标记中的所有字符。这个标签由序列组成< / >标记,其中标签无论是人物被抓获的令牌。

hstr ='<!评论>   默认点击';expr =' < (\ w +)。* ? >。* ? < / \ 1 > ';[垫,TOK] =正规表达式(hstr,EXPR,'比赛',“令牌”);垫{:}
ANS = ' ' ANS = '默认的'
TOK {:}
ANS = 1×1单元阵列{ '一个'} ANS = 1×1单元阵列{ 'B'}

多个令牌

下面是令牌是如何分配的值的示例。假设你要寻找以下文字:

安迪·特德吉姆·鲍勃安德鲁安迪·泰德标志

您选择搜索以上文字与以下搜索模式:

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

这种模式有一个生成令牌3个括号表达式。当你最终执行搜索,在每场比赛中产生的下列标记。

比赛

令牌1

令牌2

安迪

y

泰德

t

d

安德鲁

报答

安迪

y

泰德

t

d

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

无与伦比的令牌

对于正则表达式中指定的与正在计算的文本不匹配的标记,正则表达式regexpi返回一个空字符向量()作为标记输出和的程度,即标记,其中所述令牌预计在字符串中的位置。

这里显示的示例执行正则表达式指定从MATLAB返回的路径的字符向量®tempdir功能。正则表达式EXPR包括六个令牌说明符,一个针对每条路径的。第三个符[a - z] +有没有在特征向量匹配,因为路径的一部分,配置文件,开始以大写字母:

装备= tempdir
装备= ' C: \ WINNT \ Profiles \ bpascal \当地人~ 1 \ Temp \ '
EXPR = [”([a - z]:) \ \ (WINNT) \ \ [a - z] +) ?。* \ \ ''([A-Z] +)\\([A-Z] +〜\ d)\\(TEMP)\\'];[TOK,分机] =正规表达式(CHR,EXPR,“令牌”,“tokenExtents”);

当在文本中找不到标记时,正则表达式返回一个空字符向量()作为令牌和与令牌程度一个数值数组。的程度的第一个数字是字符串索引标记,其中所述标记是意料之中的,以及在何种程度的所述第二数量等于一个小于第一。

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

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

变量中返回的第三个标记区段ext具有起始索引设置为10,这是不匹配的术语,其中,配置文件,开始在路径。结束程度索引被设置为一个小于所述起始索引,或9:1

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 =“贝克,诺玛吉恩”

名叫捕获

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

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

POE = [“当我打盹,几乎是打盹的时候,”“突然传来了敲击声,”];正则表达式(坡,(? < anychar >。) \ k < anychar > ','比赛')
ans = 1×4 cell array {'dd'} {'pp'} {'dd'} {'pp'}

命名令牌也可以在标记从MATLAB正则表达式函数的输出是有用的。当您正在处理文本的许多作品尤其如此。

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

chr1 =缅因街134号,Boulder, CO, 14923;chr2 =托皮卡市胡桃路26号,邮编25384;CHR3 =新泽西州伊丽莎白市工业大道847号,邮编73548;p1 ='( \ d + \ S \ S + \ S(路|?街|大道|驱动))';p2 =‘(? <城市> [a - z] [a - z] +)”;P3 =‘(? <国家> [a - z] {2})”;p4 ='(<?拉链> \ d {5})';expr = [p1''P2''P3''p4);

如下面的结果证明,你可以让你的输出更易于工作,使用名为令牌:

LOC1 =正则表达式(CHR1,EXPR,“名字”)
loc1 = struct with fields: adrs: '134 Main Street'城市:'Boulder'州:'CO' zip: '14923'
LOC2 =正则表达式(CHR 2,EXPR,“名字”)
LOC2 =结构与字段:不良反应:'26核桃路”城市:‘托皮卡’状态:‘KA’拉链:‘25384’
中Loc3 =正则表达式(CHR 3,EXPR,“名字”)
loc3 = struct with fields: adrs: '847 Industrial Drive'城市:'Elizabeth'州:'NJ' zip: '73548'

另请参阅

||

相关话题