正则表达式中的令牌
简介
正则表达式中使用的括号不仅将该表达式的元素组合在一起,而且还将为该组找到的任何匹配项指定为令牌.您可以使用标记来匹配同一文本的其他部分。使用令牌的一个优点是它们会记住所匹配的内容,因此您可以在搜索或替换过程中回忆和重用匹配的文本。
表达式中的每个标记都被分配了一个数字,从1开始,从左到右。若要在表达式后面引用令牌,请使用反斜杠后跟令牌号引用它。例如,当引用表达式中第三组括号生成的令牌时,使用\ 3
.
举个简单的例子,如果想在字符数组中搜索相同的连续字母,可以捕获第一个字母作为标记,然后立即搜索匹配的字符。在下面的表达式中,(\ S)
Phrase在任何时候都会创建一个令牌正则表达式
匹配字符数组中的任何非空白字符。表达式的第二部分,“\ 1”
,查找紧跟着第一个字符的第二个相同字符实例。
POE = [“当我点点头,几乎打瞌睡时,”...突然传来敲击声,];[mat,tok,ext] = regexp(poe,“(\ S) \ 1”,“匹配”,...“令牌”,“tokenExtents”);垫
Mat = 1×4单元格数组{'dd'} {'pp'} {'dd'} {'pp'}
单元格数组托托
包含每个单元格数组都包含一个令牌。
托托{:}
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 =“< !评论> <名称= " 752507 " > < / > < b >默认< / b > < br > ';expr =' < (\ w +)。* ? >。* ?< 1 > / \ ';[mat,tok] = regexp(hstr, expr,“匹配”,“令牌”);垫{:}
ans = ' <名称= " 752507 " > < / > ' ans = < b > < / b >违约的
托托{:}
Ans = 1×1单元格数组{'a'} Ans = 1×1单元格数组{'b'}
多个令牌
下面是如何为令牌赋值的示例。假设你要搜索以下文本:
安迪特德鲍勃吉姆安德鲁安迪特德马克
您选择使用以下搜索模式搜索上述文本:
和(y |奖赏)| (t) e (d)
此模式有三个生成标记的插入表达式。当您最终执行搜索时,将为每个匹配生成以下令牌。
匹配 |
令牌1 |
令牌2 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
只使用最高级的括号。例如,如果搜索模式和(y |报酬)
查找文本安德鲁
,令牌1被赋值报答
.但是,如果搜索模式(和(y |报酬)
使用时,令牌1被赋值安德鲁
.
无与伦比的令牌
对于正则表达式中指定的那些在被求值的文本中没有匹配的标记,正则表达式
而且regexpi
返回一个空字符向量(”
)作为令牌输出,以及一个区段,标记期望令牌在字符串中的位置。
这里显示的示例执行正则表达式
在字符向量上指定从MATLAB返回的路径®tempdir
函数。正则表达式expr
包含六个令牌说明符,每个表示路径的一部分。第三个说明符[a - z] +
在字符向量中没有匹配,因为这部分路径,配置文件
,以大写字母开头:
CHR = tempdir
chr = 'C:\WINNT\Profiles\bpascal\LOCALS~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
等。
POE = [“当我点点头,几乎打瞌睡时,”...突然传来敲击声,];正则表达式(坡,‘(? < anychar >)。\ k < anychar >”,“匹配”)
Ans = 1×4单元格数组{'dd'} {'pp'} {'dd'} {'pp'}
命名标记在标记MATLAB正则表达式函数的输出时也很有用。当你处理很多文本时,这一点尤其正确。
例如,从几个字符向量解析街道地址的不同部分。为表达式中的每个令牌分配一个简短的名称:
chr1 =科罗拉多州博尔德市主街134号邮编:14923;chr2 =卡州托皮卡核桃路26号,邮编25384;chr3 =地址:新泽西州伊丽莎白工业路847号邮编: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 = struct with fields: adrs: '134 Main Street'城市:'Boulder'州:'CO' zip: '14923'
Loc2 = regexp(chr2, expr,“名字”)
loc2 = struct with fields: adrs: '26核桃路'城市:'托皮卡'状态:'KA' zip: '25384'
Loc3 = regexp(chr3, expr,“名字”)
loc3 = struct with fields: adrs: '847 Industrial Drive'城市:'伊丽莎白'州:'新泽西州' zip: '73548'