在C#中使⽤正则表达式提取括号中的内容
问题
给定字符串 "OUTPUT/FA(CIR1),TA(POS1__X),TA(POS1__Y),TA(POS1__Z),TA(POS1__D)" 现在需要取得括号中的内容,如
CIR1、POS1__X、POS1__Y 和POS1__Z,如果我们使⽤字符串操作,肯定是可以取得,但是如果类似的操作⽐较频繁,我们完全可以使⽤正则表达式来完成。
正则模式定义
假定括号中的内容是数字、字母和下划线,那么我们可以使⽤以下字符来定义:
[0-9a-zA-Z_]+ 或者可以直接使⽤简化符号/w,变为 \w+。因为我们要查的带括号字符串,所以还需要将以上内容加上括号。在正则表达式中,如果要匹配括号是需要转义的,所以字符串变为:\(\w+\)。
这时,带括号的字符串都会被匹配到。但是匹配到的内容是带括号的,⽐如 (CIR1),如果这样取的话,我们还需要将返回的结果再去⼀次括号,显然是多余的。我们还可以通过正则表达式提取指定的内容,使⽤括号即可(注:不需要转义),这时正则表达式的模式就变成了:\((\w+)\),即给 \w+ 加上括号,这样即可指定取得括号中的内容,如 CIR1。
特别注意⼀下括号的两种⽤法,对⽐如下:
原义:⽤于取得括号中的内容;
转义:表⽰字符串中的括号。
在C#中使⽤Regex类
在C#中使⽤Regex类来处理正则表达式,使⽤的过程分为以下三步:
第1步 定义正则表达式模式(pattern):
Regex r = new Regex(@"\((\w+)\)");
第2步 对指定字符串进⾏匹配
var ms = r.Matches("OUTPUT/FA(CIR1),TA(POS1__X),TA(POS1__Y),TA(POS1__Z),TA(POS1__D)");
通过以上代码,在返回的结果 ms 中,即可获得所需要的代码。
第3步 取出匹配到的内容
返回的结果是⼀个集合,有多个匹配,我们可以对其中某⼀个匹配进⾏操作,如 Match m = ms.ToArray()[0];,此时 我们可以使⽤m.Groups 获得匹配到的内容。由于在正则模式中可以定义多个括号,所以 Groups 中会有多个内容,其第0个元素表⽰表⽰所有的选中内容,⽽第1个起,表⽰第1个括号中的内容,以此类推,⽐如 m.Groups[1] 表⽰ CIR1。
源代码和运⾏结果
⾸先,我们看下使⽤ \((\w+)\) 对 OUTPUT/FA(CIR1),TA(POS1__X),TA(POS1__Y),TA(POS1__Z),TA(POS1__D) 匹配后的运⾏结果:
9: (CIR1), groups: CIR1
18: (POS1__X), groups: POS1__X
30: (POS1__Y), groups: POS1__Y
42: (POS1__Z), groups: POS1__Z
54: (POS1__D), groups: POS1__D
源代码如下所⽰。
using System;
using System.Text;
using System.Text.RegularExpressions;
namespace RegexDemo
{
class Program
{
static void Main(string[] args)
{
//matchTest(@"\d");
Regex r =new Regex(@"\((\w+)\)");
var ms = r.Matches("OUTPUT/FA(CIR1),TA(POS1__X),TA(POS1__Y),TA(POS1__Z),TA(POS1__D)"); foreach(var m in ms.ToArray())
{
Console.WriteLine("{0}: {1}, groups: {2}", m.Index, m.Value, m.Groups[1]);
}
}
正则表达式获取括号内容}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论