1

我对我的正则表达式结果有点困惑(并且仍在尝试理解语法)。我一直在使用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(); 
4

2 回答 2

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对象返回。

而对于Regex.Matches

在输入字符串中搜索所有出现的正则表达式并返回所有成功的匹配项。

注意: 您在这里所做的似乎非常错误。如果您正在处理的是 XML 或类似的语言,那么请不要使用正则表达式来解析它。否则你会因为嵌套结构而生气。

于 2010-03-17T10:44:14.887 回答
0

你真的想<open>在每场比赛开始时都有吗?为什么不也使用lookbehind?

(?<=<open>).*?(?=</open>)
于 2010-03-17T11:02:51.267 回答