WEB开发网
开发学院软件开发C语言 C#正则表达式高级技巧及实例详解 阅读

C#正则表达式高级技巧及实例详解

 2009-06-10 08:32:04 来源:WEB开发网   
核心提示: 这个表达式从开头的双引号开始匹配,遭遇单引号之后就错误地结束了匹配,C#正则表达式高级技巧及实例详解(3),这是因为表达式里说:("|'),也就是双引号(")和单引号(')均可,有名组使用(?P<name>pattern)来设定,name代表

这个表达式从开头的双引号开始匹配,遭遇单引号之后就错误地结束了匹配。这是因为表达式里说:("|'),也就是双引号(")和单引号(')均可。要修正这个问题,你可以用到回返引用。表达式\1,\2,…,\9 是对前面已捕获到的各个子内容的编组序号,能作为对这些编组的“指针”而被引用。在此例中,第一个被匹配的引号就由\1代表。

如何运用?

将上面的例子中,后面的闭合引号替换为1:

preg_match( '/(\"|').*?\1/', $str, $matches );

这会正确地返回字串:

"This is a 'string'"

译注思考题:

如果是中文引号,前引号和后引号不是同一个字符,怎么办?

还记得PHP函数 preg_replace 吗?其中也有回返引用。只不过我们没有用 \1 … \9,而是用了 $1 … $9 … $n (此处任意数目均可)作为回返指针。例如,如果你想把所有的段落标签<p>都替换成文本:

$text = preg_replace( '/<p>(.*?)</p>/',

"<p>$1</p>", $html );

参数$1是一个回返引用,代表段落标签<p>内部的文字,并插入到替换后的文本里。这种简便易用的表达式写法为我们提供了一个获取已匹配文字的简单方法,甚至在替换文本时也能使用。

3. 已命名捕获组(Named Groups)

当在一个表达式内多次用到回调引用时,很容易就把事情搞混淆,要弄清那些数字(1 … 9)都代表哪一个子内容是件很麻烦的事。回调引用的一个替代方法是使用带名字的捕获组(下文简称“有名组”)。有名组使用(?P<name>pattern)来设定,name代表组名,pattern是配合该有名组的正则结构。请看下面的例子:

上一页  1 2 3 4 5 6 7  下一页

Tags:正则 表达式 高级

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接