c# Regex.Match 问题与多个匹配结果

本文关键字:结果 Regex Match 问题 | 更新日期: 2023-09-27 17:53:35

我正在尝试使用Regex.Matchs,它的工作方式似乎与我习惯于使用PHP等其他语言的方式不同。这是我正在尝试做的:

我想从特定网页获取所有表单,但是当我尝试执行以下操作时

        String pattern = "(?i)<form[^<>]*>(.*)<''/form>"; 
        MatchCollection matches = Regex.Matches(content, pattern );
        foreach (Match myMatch in matches)
        {
            MessageBox.Show(myMatch.Result("$1"));
        }

即使该页面上有三个窗体,此代码也不会显示任何内容。似乎当我使用 (.*( 时,它只是跳过所有内容直到内容结束。

c# Regex.Match 问题与多个匹配结果

默认情况下,Regex类使.运算符不匹配 ''r 和 '。尝试替换它:

MatchCollection matches = Regex.Matches(content, pattern );

跟:

MatchCollection matches = Regex.Matches(content, pattern, RegexOptions.Singleline);

对正则表达式的主要部分尝试这样的事情:

    String pattern = "<form[''d''D]*?</form>";

这是我目前用来从文档中删除特定类型的所有标签的模式,但应该可以很好地找到表单标签。如果需要,可以更改 ''d''D 部分。

string pattern = @"(?is)<form[^<>]*>(.*?)</form>"; 

该正则表达式在PHP和C#(或者更准确地说,PCRE和.NET(中应该相同。 如果您在没有?的情况下在 PHP 中获得最少的匹配项,您可能设置了/U("不贪婪"(选项,例如:

preg_match_all('~<form[^<>]*>(.*)</form>~isU', $subject, $matches);

preg_match_all('~(?isU)<form[^<>]*>(.*)</form>~', $subject, $matches);

.NET没有PCRE的不贪婪模式的等价物。