我对我的正则表达式结果感到有些困惑(并且仍然试图理解我的语法)。我一直在使用http://regexpal.com/来测试我的表达,并且它的工作原理在那里,但是在C#中它并不像预期的那样。
这是一个测试 - 以下表达式:(?=<open>).*?(?=</open>)
在输入字符串上:
<open>Text 1 </open>Text 2 <open>Text 3 </open>Text 4 <open>Text 5 </open>
我希望得到<open>Text1 <open>Text 2 <open>Text 3...
等的结果
但是,当我在C#中执行此操作时,它只返回<open>Text1
如何从正则表达式中获取所有五个“结果”?
Regex exx = new Regex("(?=<open>).*?(?=</open>)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
string input = "<open>Text 1</open> Text 2 <open> Text 3 </open> Text 4 <open> Text 5 </open>";
string result = Regex.Match(input, exx.ToString(), exx.Options).ToString();
答案 0 :(得分:1)
使用Regex.Matches
代替Regex.Match
。
PS Home:> $s = '<open>Text 1 </open>Text 2 <open>Text 3 </open>Text 4 <open>Text 5 </open>'
PS Home:> $re = '(?=<open>).*?(?=</open>)'
PS Home:> @([regex]::Match($s, $re)).Length
1
PS Home:> @([regex]::Matches($s, $re)).Length
3
正如Regex.Match
所述的文档:
在输入字符串中搜索与正则表达式模式匹配的子字符串,并将第一个匹配项作为单个Match对象返回。
在输入字符串中搜索所有正则表达式,并返回所有成功匹配。
注意: 你在这里做的事情似乎非常错误。如果您正在处理的是XML或类似语言,请不要使用正则表达式来解析它。您将get mad otherwise使用嵌套结构。
答案 1 :(得分:0)
你真的想在每场比赛开始时都有<open>
吗?为什么不使用lookbehind呢?
(?<=<open>).*?(?=</open>)