在正则表达式中使用的圆括号不仅将该表达式的元素组合在一起,而且还将为该组找到的任何匹配指定为令牌。您可以使用令牌匹配相同文本的其他部分。使用令牌的一个优点是他们记得他们匹配的内容,因此您可以在搜索或更换过程中回忆和重用匹配的文本。
表达式中的每个标记都被分配一个数字,从1开始,从左到右。要在表达式的后面引用某个标记,请使用后跟标记号的反斜杠引用它。例如,当引用表达式中第三组括号生成的标记时,使用\ 3
。
作为一个简单的例子,如果您想在字符数组中搜索相同的顺序字母,则可以将第一个字母作为令牌捕获,然后在之后立即搜索匹配字符。在下面所示的表达式中,(\ \)
短语在任何时候创建一个标记正则表达式
匹配字符数组中的任何非向量空间字符。表达的第二部分,“\ 1”
,请在第一个后立即查找同一字符的第二个实例。
坡= [“虽然我点点头,几乎漂亮,'......“突然间来了,”];(垫、托托,ext) = regexp(坡,'(\ s)\ 1'那“匹配”那......'令牌'那'tokenextents');垫
mat = 1×4单元阵列{'dd'} {'pp'} {'dd'} {'pp'}
细胞阵列托托
包含每个单元数组都包含一个令牌的单元数组。
托托{:}
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 11ns = 26 26 ans = 35 35 35 ans = 57 57
另一个例子是,捕获匹配的HTML标签对(例如,<一>
和)和它们之间的文字。用于此示例的表达式是
expr ='<(\ w +)。*?>。*? \ 1>';
表达式的第一部分,' < (\ w +) '
,匹配开口角支架(<
)后跟一个或多个字母,数字或下划线字符。封闭括号捕获开口角支架后的令牌字符。
表达的第二部分,”。* ? >。* ?”
,匹配该HTML标记的其余部分(字符到>
)以及任何可能在下一个开口角度括号之前的任何字符。
最后一部分,' \ 1>'
,匹配结束HTML标记中的所有字符。此标记由序列组成 tag>
,在那里标签
是作为标记捕获的任何字符。
hstr =“< !评论> <名称= " 752507 " > < / > < b >默认< / b > < br > ';expr ='<(\ w +)。*?>。*? \ 1>';[mat,tok] = regexp(hstr, expr)“匹配”那'令牌');垫{:}
ans = ' <名称= " 752507 " > < / > ' ans = < b > < / b >违约的
托托{:}
ans = 1×1 cell array {'a'}
下面是一个如何为令牌赋值的示例。假设你要搜索以下文本:
安迪,泰德,鲍勃,吉姆,安德鲁,安迪,泰德,马克
您选择使用以下搜索模式搜索上述文本:
(Y | REW)|(T)E(D)
该模式有三个括号表达式,它们生成标记。当您最终执行搜索时,将为每个匹配生成以下标记。
匹配 |
令牌1 |
令牌2 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
只使用最高级别的括号。例如,如果搜索模式(y | REW)
找到文本安德鲁
,令牌1被赋值训
。但是,如果搜索模式(和(y | rew))
使用,令牌1被分配了值安德鲁
。
对于在正常表达式中指定的那些令牌,在正在评估的文本中没有匹配,正则表达式
和regexpi.
返回空字符向量(''
)作为令牌的输出,以及标记该令牌在字符串中的预期位置的范围。
执行这里显示的示例正则表达式
在一个字符向量上,指定从MATLAB返回的路径®Tempdir.
函数。正则表达式expr
包括6个令牌说明符,一个用于路径的每个部分。第三个说明符[A-Z] +
在字符向量中没有匹配,因为这部分路径,概要文件
,以大写字母开头:
CHR = TEMPDIR.
chr ='c:\ winnt \ profiles \ b ppascal \ locals〜1 \ temp \'
expr = ['([a-z] :) \\(winnt)\\([a-z] +)?。* \\'......”([a - z] +) \ \ [a - z] + ~ \ d) \ \(临时)\ \ '];[tok, ext] = regexp(chr, exr)'令牌'那'tokenextents');
在文中找不到令牌时,正则表达式
返回一个空的字符向量(''
)作为标记和带有标记范围的数字数组。范围的第一个数字是字符串索引,它标记了标记的期望位置,范围的第二个数字比第一个数字小1。
在此示例的情况下,空令牌是表达式中指定的第三个,因此返回的第三个令牌是空的:
托托{:}
ans = 1×6 Cell array {'C:'} {'winnt'} {'winnt'} {0×0 char} {'bpascal'} {'locals〜1'} {'temp'}
在变量中返回的第三个令牌范围ext.
将起始索引设置为10,其中不匹配的项,概要文件
,始于道路。结束区段索引被设置为比开始索引小1,或9:
ext {:}
ans = 1 2 4 8 10 9 19 25 27 34 36 39
在替换文本中使用令牌时,请使用它们1美元
那2美元
等等而不是\ 1
那\ 2
等。这个示例捕获了两个令牌,并颠倒了它们的顺序。第一,1美元
,是'norma jean'
第二,2美元
,是“贝克”
。请注意,regexprep.
返回修改后的文本,而不是起始索引的向量。
regexprep('norma jean baker'那'(\ w + s \ w +)\ s(\ w +)'那'2美元,1美元')
ans = '面包师,诺玛·吉恩'
如果您在表达式中使用了很多令牌,则会分配它们可能会有所帮助,而不是必须跟踪哪个令牌编号被分配给哪些令牌。
在表达式中引用名为命名令牌时,请使用语法\ k <名称>
而不是数字\ 1
那\ 2
等等:
坡= [“虽然我点点头,几乎漂亮,'......“突然间来了,”];Regexp(Poe,'(?。)\ k 那“匹配”)'
ans = 1×4单元阵列{'dd'} {'pp'} {'dd'} {'pp'}
命名标记在标记MATLAB正则表达式函数的输出时也很有用。当您处理许多文本片段时,尤其如此。
例如,从几个字符向量解析街道地址的不同部分。表达式中的每个令牌分配了一个短名称:
CHR1 ='134 Main Street,Boulder,Co,14923'';CHR2 ='26核桃路,Topeka,Ka,25384';chr3 ='847工业驾驶,伊丽莎白,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(chr1, expr,'名字')
LOC1 =带有字段的结构:ADRS:'134 Main Street'城市:'博尔德'州:'Co'Zip:'14923'
loc2 = regexp(chr2, expr,'名字')
loc2 = struct with fields: adrs: '26 Walnut Road' city: 'Topeka' state: 'KA' zip: '25384'
loc3 = regexp(chr3, expr,'名字')
LOC3 =带有字段的结构:ADRS:'847工业驾驶'城市:'Elizabeth'状态:'NJ'Zip:'73548'