在正则表达式使用不仅如此表达的组元素一起,还指定任何匹配括号发现该基团作为令牌。您可以使用标记来匹配同一文本的其他部分。使用令牌的一个好处是它们会记住它们匹配的内容,因此您可以在搜索或替换过程中回忆和重用匹配的文本。
表达式中的每令牌被分配一个号码,从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标记中的所有字符。这个标签由序列组成< / >标记
,其中标签
无论是人物被抓获的令牌。
TOK {:}
ANS = 1×1单元阵列{ '一个'} ANS = 1×1单元阵列{ 'B'}
下面是令牌是如何分配的值的示例。假设你要寻找以下文字:
安迪·特德吉姆·鲍勃安德鲁安迪·泰德标志
您选择搜索以上文字与以下搜索模式:
和(y |奖赏)| (t) e (d)
这种模式有一个生成令牌3个括号表达式。当你最终执行搜索,在每场比赛中产生的下列标记。
比赛 |
令牌1 |
令牌2 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
只使用最高级别的括号。例如,如果搜索模式和(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'