我有一个这样的字符串:
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;
但它不起作用。它不匹配。我该怎么办?
答案 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"
群组的访问显然需要更加强大 - 这纯粹是出于示范目的。
答案 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