C# ASP.NET标记的正则表达式解析

C# ASP.NET标记的正则表达式解析,c#,asp.net,regex,C#,Asp.net,Regex,我有一个解析各种文件格式的程序,目标是找到可本地化的字符串(GetText)。我正在寻找一个正则表达式,它可以从特定的开始和结束标记中获取“要翻译的文本”。我有一个正常工作的正则表达式,但由于IsVisible调用,下面的示例破坏了它 <mw:Translate runat="server" Visible='<%# IsVisible() %>'> TEXT TO TRANSLATE </mw:Translate> 要翻译的文本 这就是我到目前为止所做

我有一个解析各种文件格式的程序,目标是找到可本地化的字符串(GetText)。我正在寻找一个正则表达式,它可以从特定的开始和结束标记中获取“要翻译的文本”。我有一个正常工作的正则表达式,但由于IsVisible调用,下面的示例破坏了它

<mw:Translate runat="server" Visible='<%# IsVisible() %>'>
TEXT TO TRANSLATE
</mw:Translate>

要翻译的文本
这就是我到目前为止所做的,但我被困在里面了……有什么帮助吗?我在//comments中描述了我错误的regexxed意图

(?s)                   //multiline flag

\<mw\:Translate        //opening <mw:Translate> tag

(?:(?![^"']+\s*\>)+)   //match anything but > preceeded by " or ' 
                       //with any whitespace after it
(?:["']+\s*)\>         //match > preceeded by " or ' with any 
                       //whitespace after it

\s*                    //match any whitespace 
                       //(for trimming any whitespace around the text)
(?<text>.*?)           //capturing group for the localizable text
\s*                    //match any whitespace 

\</mw\:Translate\>     //match closing tag
(?s)//多行标志
\//匹配>前面带有“或”的任意
//后面的空格
\s*//匹配任何空格
//(用于修剪文本周围的任何空白)
(?*?///可本地化文本的捕获组
\s*//匹配任何空格
\//匹配结束标记
我遇到的问题可能是在开始标记中…我试图匹配结束括号>,只有当它前面有“或”时,后面没有空格或任何空格…因为否则它要么像%>或者它不是有效的ASP.NET

编辑1:在得出结论之前,请阅读问题。这不是HTML而是ASP.NET,任何HTML解析器都无法很好地解析它。我的目标也非常明确。更正:人们似乎同意它可以用HtmlAgility pack解析,但我真的不想使用它,因为我真的不喜欢在一个简单的用例中依赖外部库

编辑2:mw:Translate不能嵌套。因为mw:Translate是如何编程的,所以它根本无法编译

编辑3:编辑的澄清

编辑4:不允许自动关闭mw:翻译

在mw:Translate中编辑5:HTML与ASP.NET页面上的任何其他文本一样有效


编辑6:我自己回答说,我需要的正则表达式可能有点复杂(但不是因为与HTML有任何关系),请参见下面的

我会尝试匹配属性列表,假设属性用引号或单引号括起来。
这一假设并不适用于所有HTML,但可能适用于您:

<mw:Translate       #opening <mw:Translate> tag
# Match attributes
(?:\s+\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'))?)*
\s*
>                   #match >
\s*
(?<text>.*?)        #capturing group for the localizable text
\s*                 #match any whitespace 
</mw:Translate>     #match closing tag

我会尝试匹配属性列表,假设属性用引号或单引号括起来。
这一假设并不适用于所有HTML,但可能适用于您:

<mw:Translate       #opening <mw:Translate> tag
# Match attributes
(?:\s+\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'))?)*
\s*
>                   #match >
\s*
(?<text>.*?)        #capturing group for the localizable text
\s*                 #match any whitespace 
</mw:Translate>     #match closing tag

即使您修改了正则表达式。这里有一些问题

  • 如果内部有其他标记,则不起作用(next无法用正则表达式解决此问题)
  • asp.net可以有像

    您可以使用此代码通过
    HtmlAgilityPack

    HtmlDocument doc = new HtmlDocument();
    doc.Load(yourStream);
    
    var itemList = doc.DocumentNode.SelectNodes("//Translate")//this xpath selects all translate tag
                      .Select(p => p.InnerText)
                      .ToList();
    
    //itemList now contain all the translate tags content
    

    即使你修改了你的正则表达式。这里有一些问题

    • 如果内部有其他标记,则不起作用(next无法用正则表达式解决此问题)
    • asp.net可以有像

      您可以使用此代码通过
      HtmlAgilityPack

      HtmlDocument doc = new HtmlDocument();
      doc.Load(yourStream);
      
      var itemList = doc.DocumentNode.SelectNodes("//Translate")//this xpath selects all translate tag
                        .Select(p => p.InnerText)
                        .ToList();
      
      //itemList now contain all the translate tags content
      

      即使这是ASP.NET而不是HTML,您也可以使用它进行解析

      var doc = new HtmlAgilityPack.HtmlDocument();
      doc.LoadHtml(html); // html is the aspx document text
      var translatableTextNodes = 
          doc.DocumentNode.SelectNodes("//text()[contains(., 'TEXT TO TRANSLATE')]");
      foreach (var parent in translatableTextNodes)
          Console.WriteLine("Node:[{0}] Text:{1}",parent.Name, parent.InnerText);
      
      输出一个示例页面,其中包含一个服务器控件,其中包含要翻译的
      文本

      Node:[mw:translate] Text:
      TEXT TO TRANSLATE
      

      即使这是ASP.NET而不是HTML,您也可以使用它进行解析

      var doc = new HtmlAgilityPack.HtmlDocument();
      doc.LoadHtml(html); // html is the aspx document text
      var translatableTextNodes = 
          doc.DocumentNode.SelectNodes("//text()[contains(., 'TEXT TO TRANSLATE')]");
      foreach (var parent in translatableTextNodes)
          Console.WriteLine("Node:[{0}] Text:{1}",parent.Name, parent.InnerText);
      
      输出一个示例页面,其中包含一个服务器控件,其中包含要翻译的
      文本

      Node:[mw:translate] Text:
      TEXT TO TRANSLATE
      


      感谢regex,您已经破坏了您的代码…使用html解析器不要使用regex来解析html,但一定有一个原因强烈反对regex处理html标记,伙计们,ASP.NET不是html。它甚至不是一个XML。我不知道为什么我应该使用任何叫做“HtmlAgilityPack”的东西来解析ASP.NET。这里的陷阱是什么?这个用例有非常具体的规则。我非常清楚使用正则表达式生成HTML的问题,但事实并非如此。如果你认为是这样的话,你可以在一个有效的答案中愚弄我。多亏了regex,你破坏了你的代码…使用html解析器不要使用regex解析html,但regex被强烈劝阻处理html标记的原因一定有,伙计们,ASP.NET不是html。它甚至不是一个XML。我不知道为什么我应该使用任何叫做“HtmlAgilityPack”的东西来解析ASP.NET。这里的陷阱是什么?这个用例有非常具体的规则。我非常清楚使用正则表达式生成HTML的问题,但事实并非如此。如果你认为是的话,你可以在一个有效的答案中愚弄我。不会使用嵌套的翻译标签。有时没有结束语tag@Anirudh-这是要求吗?OP确认没有嵌套tags@Jerry它不是关于嵌套标记..而是结束标记..asp.net可以有自动关闭标记。asp.net也可以有内联C#代码,阻止客户端标记的服务器端标记等(例如,考虑中继器模板中的
        • )。在我看来,试图将它们解析为HTML比正则表达式更危险。您需要一个ASPX解析器。它无法处理嵌套的翻译标记。有时没有结束符tag@Anirudh-这是要求吗?OP确认没有嵌套tags@Jerry它不是关于嵌套标记,而是关于结束标记。asp.net可以有自动关闭标记。asp.net也可以有内联C#代码、阻止客户端标记的服务器端标记等(例如,考虑中继器模板中的
            • )。在我看来,试图将这些标记解析为HTML比正则表达式更危险。您需要一个ASPX解析器。这些标记不能嵌套。它不会编译。我同意我应该这样写。@Motig所说的嵌套标记是指其他标记,例如,在这种情况下,它们是文本的一部分,并且被解析为文本。与“asdf”没有区别。这些标记中的任何内容都是字符串。如果任何地方都有结束标记,即使是任何疯狂的无效HTML的一部分,只要它是结束标记,它就是有效的