正则表达式,匹配标签内的文本,然后匹配该标签中的所有文本都来自相同的字符串?

时间:2011-10-17 19:57:31

标签: c# .net regex

我对Regex's感到很沮丧,我很惊讶能够达到我自己的目的。

到目前为止,我已经得到了这个:

string text = "Whoa here is some very cool text.<phone>222-222-5555</phone><timesCalled>6</timescalled>";

Regex phoneRegex = new Regex(@"<phone>(.*?)<\/phone>");
Regex calledRegex = new Regex(@"<timesCalled>(.*?)<\/timesCalled>");
string phone = phoneRegex.Match(text).Value;
string timesCalled = calledRegex.Match(text).Value;

这两个都给了我完整的标签和里面的值,我怎么做它所以它只返回标签里面的东西? 此外,我还需要一个最终的正则表达式,它会返回不在这些标记内的所有文本,所以Whoa here is some very cool text.来自上面的示例。特殊标记总是出现在普通文本之后,如果重要的话。

编辑:感谢所有的答案,我仍然需要最终的正则表达式(上面加粗)。

到目前为止,我试过这个:

 string pattern = @"^" + phoneRegex.Match(text).Value + calledRegex.Match(text).Value;
 Regex textRegex = new Regex(pattern);
 string normalText = textRegex.Match(text).Groups[1].Value;

但这没有任何回报。

5 个答案:

答案 0 :(得分:2)

您想获得该组的价值:

calledregex.Match(text).Groups[1].Value

群组是从1开始的。

答案 1 :(得分:1)

如何使用Xml类读取/解析XML?

var doc = XElement.Parse("<root>" + text + "</root>");
string phone = doc.Descendants("phone").First().Value;

答案 2 :(得分:1)

这是我的建议,让您有机会搜索更多带有值的标签。

 string text = "Whoa here is some very cool text.<phone>222-222-5555</phone><timesCalled>6</timesCalled>";

 Regex regex = new Regex(@"<(?<tag>[^>]*)>(?<value>[^<]*)</\k<tag>>");
 Match match = regex.Match(text);
 string phone = match.Groups["value"].Captures[match.Groups["tag"].Captures.OfType<Capture>().FirstOrDefault(item => item.Value == "phone").Index].Value;
 string timesCalled = match.Groups["value"].Captures[match.Groups["tag"].Captures.OfType<Capture>().FirstOrDefault(item => item.Value == "timesCalled").Index].Value;

答案 3 :(得分:0)

匹配的Value是与模式匹配的所有内容。如果您只想要分组内容(标签内的内容),则必须通过Groups属性访问它们。

string phone = phoneRegex.Match(text).Groups[1].Value;
string timesCalled = calledregex.Match(text).Groups[1].Value;

答案 4 :(得分:0)

在内联xml / html的情况下,我也会忽略大小写,有时候标记大写可能会很糟糕。

string text = "Whoa here is some very cool text.<phone>222-222-5555</phone><timesCalled>6</timesCalled>";

Regex phoneRegex = new Regex(@"<phone>(.*?)<\/phone>", RegexOptions.IgnoreCase);
Regex calledRegex = new Regex(@"<timesCalled>(.*?)<\/timesCalled>", RegexOptions.IgnoreCase);
string phone = phoneRegex.Match(text).Groups[1].Value;
string timesCalled = calledRegex.Match(text).Groups[1].Value;