只返回正则表达式的部分匹配

时间:2009-03-10 00:37:59

标签: c# regex

假设我有一个字符串“User Name:firstname.surname”包含在一个更大的字符串中,如何使用正则表达式来获取firstname.surname部分?

我尝试的每个方法都会返回字符串“User Name:firstname.surname”,然后我必须在“User Name:”上将字符串替换为空字符串。

可以在这里使用引用吗?

编辑:

较长的字符串可能包含“帐户名:firstname.surname”,因此我想要匹配字符串的“用户名:”部分以及获取该值。

4 个答案:

答案 0 :(得分:32)

我喜欢使用命名组:

Match m = Regex.Match("User Name:first.sur", @"User Name:(?<name>\w+\.\w+)");
if(m.Success)
{
   string name = m.Groups["name"].Value;
}

?<something>放在括号中的组的开头(例如(?<something>...)),可以使用something作为关键字从匹配中获取值(例如来自{{1} }})

如果你不想麻烦地命名你的小组,你可以说

m.Groups["something"].Value

然后得到匹配的第一件事。 (请注意,第一个带括号的组位于索引Match m = Regex.Match("User Name:first.sur", @"User Name:(\w+\.\w+)"); if(m.Success) { string name = m.Groups[1].Value; } ;匹配的整个表达式位于索引1

答案 1 :(得分:6)

您还可以尝试“环视”的概念。这是一种零宽度断言,意味着它将匹配字符,但不会在结果中捕获它们。

在你的情况下,我们可以采取积极的观察:我们希望目标字符串“firstname.surname”背后的内容等于“用户名:”。

正向后观操作符:(?&lt; = StringBehind)StringWeWant

这可以像这样实现,例如(一个小例子,使用字符串替换):

String test = "Account Name: firstname.surname; User Name:firstname.surname";
String regex = "(?<=User Name:)firstname.surname";
String replacement = "James.Bond";
System.out.println(test.replaceAll(regex, replacement));

这只替换了“用户名:”前面的“firstname.surname”字符串,而不替换“用户名:”本身 - 正则表达式不返回,只匹配。

输出:帐户名称:firstname.surname;用户名:James.Bond

也就是说,如果您使用的语言支持此类操作

答案 2 :(得分:3)

创建一个带括号的组,然后从Match.Groups集合中获取它,如下所示:

string s = "User Name:firstname.surname";
Regex re = new Regex(@"User Name:(.*\..*)");
Match match = re.Match(s);
if (match.Success)
{
    MessageBox.Show(match.Groups[1].Value);
}

(注意:第一组,索引为0,是整场比赛)

答案 3 :(得分:2)

我使用的所有正则表达式库都允许您使用括号在正则表达式中定义组,然后从结果中访问该组。

所以,你的正则表达式可能如下所示:用户名:([^。]。[^。])

完整匹配是组0.括号内匹配的部分是组1。