19.4 标记(tokens)

19.4 标记(tokens)

这部分内容比较难, 但是应用得当可以实现非常强大的功能。

19.4.1 什么是标记

任何正则表达式都可以用圆括号括起来作为一个标记。例如,创建一个记录钱数的标记,就可以用($\d+)。这样与之匹配的字符串就会被记录下来,根据这个标记出现的顺序,可以使用\n来引用匹配这个标记的字符串。如用\3来引用与标记相匹配的第三个字符串(如果在替换函数regexprep中,则需要用$3来引用)。下面是一个例子,\S 用来查找任意的非空白字符; \1用来说明要匹配第一个tokens的内容,也就是要立即再次查找刚刚匹配到的同一个宇符,并且要紧挨着第一个;'tokens'用来向tok输出所有匹配到的标记: 而'tokenExtents'则用来表示匹配标记的起始位置。

19.4.2 如何使用标记

(expr):记录所有匹配表达式的字符,并作为一个标记,以备后面使用。如利用标记实现查找连续的重复字母。

\N:匹配同一个正则表达式第N个标记中的字符串,例如\1匹配第一个标记。下面的例子可以查找html让语句中类似<a>abc</a>的部分:

$N:在一个替换字符串中插入与第N个标记相匹配的字符串(只用于regexprep函数)。下面的例子可以将匹配到的第一个token和第二个token的位置互换:

(?<name>expr):记录所有匹配表达式expr的字符,作为一个标记,井设定一个名字name。

\k<name>:与名为name的标记相匹配。下面的例子和这部分第一个例子是一样的,只不过使用了命名的标记。

(?(tok)expr):如果标记tok己经产生,则匹配表达式expr(if-then结构)。其中的标记可以是数字标记,也可以是命名标记。

(?(tok)expr1∣expr2):如果标记tok己经产生,则匹配表达式expr1,否则匹配表达式expr2(if-then-else结构)。下面的例子用来检查一个句子中的性别用词是否匹配,即如果前面用的是'Mrs',那么后面就匹配'her'; 如果前面用的是'Mr',也就是没有匹配到'Mr'后面的's',则后面匹配'his'。