使用C#在正则表达式中查找模式

时间:2015-07-11 09:51:51

标签: c# regex

我有一个这样的字符串:

string str = "Property first {prop1=val1;prop2=val2}this is reg table[uvm]dsfhsjhsdj[/uvm]this is uvm test{pp1=vv2}";

我需要[uvm] ... [/ uvm]字符串。

我试过这个:

reg = new Regex(@"(\[uvm\].*?\[\\uvm\])");
string s = reg.Match(str).Groups[0].Value;

但它不起作用。它不匹配。我该怎么办?

3 个答案:

答案 0 :(得分:2)

问题不在于正则表达式,而在于字符串input

您输入的内容包含[/uvm]而不是[\uvm],其中正则表达式当然不会匹配。

此外,我建议您移动Capture以捕捉uvm的内部,只需移动regex内的括号,如下所示:

\[uvm\](.*?)\[\\uvm\]

答案 1 :(得分:1)

你正在使用的正则表达式有点偏离 - 你正在使用错误类型的斜杠,试试这个:

var reg = new Regex(@"(\[uvm\].*?\[\/uvm\])");

另请注意,如果要检索[uvm]标记内的文本,则需要其他组。这是一个有效的例子:

var str = "Property first {prop1=val1;prop2=val2}this is reg table[uvm]dsfhsjhsdj[/uvm]this is uvm test{pp1=vv2}";
var reg = new Regex(@"(\[uvm\](.*?)\[\/uvm\])");

var m1 = reg.Match(str).Groups[1].Value; // = "[uvm]dsfhsjhsdj[/uvm]"
var m2 = reg.Match(str).Groups[2].Value; // = "dsfhsjhsdj"

Working example

群组的访问显然需要更加强大 - 这纯粹是出于示范目的。

答案 2 :(得分:1)

如果您使用look-arounds,则无需设置任何捕获组并使用Regex.Match(str).Value获取价值:

string str = "Property first {prop1=val1;prop2=val2}this is reg table[uvm]dsfhsjhsdj[/uvm]this is uvm test{pp1=vv2}";
Regex rx = new Regex(@"(?<=\[uvm]).*?(?=\[/uvm])");
foreach (Match m in rx.Matches(str))
{
   Console.WriteLine(m.Value);
}

或者,您可以使用LINQ获取所有匹配项:

var matches = rx.Matches(str).Cast<Match>().Select(p => p.Value).ToList();

请参阅IDEONE demo

REGEX EXPLANATION

  • (?<=\[uvm]) - 确保在我们的预期结果之前有文字[uvm]字符串的正面观察
  • .*? - 任意字符串(除了换行符,如果您需要.匹配换行符,请在正则表达式声明中添加RegexOptions.Singleline标志)尽可能少(由于{ {1}}懒惰量词)
  • *? - 一个积极的预测,确保在我们的预期结果之后有文字(?=\[/uvm])

请参阅regex demo