0

我正在尝试筛选一些 HTML,并且在跨新行匹配时遇到问题(在 .Net 中)

这是文本:

<td class=abc><span class=label>XXX</span></td>
<td class=def><span class=field>YYY</span></td>

我正在尝试匹配YYY这个公式

<td class=abc><span class=label>XXX</span></td>\n<td class=def><span class=field>(.*)</span></td>

我有\n分隔线,但它不匹配......有什么想法吗?

[编辑]

添加\r\n而不仅仅是 \n 并且它有效。

4

2 回答 2

1

您需要为您的正则表达式使用多行修饰符m。在 VB.NET 中,这是作为正则表达式的选项提供的。但是您还需要使用反斜杠转义所有正斜杠:

<td class=abc><span class=label>XXX<\/span><\/td>\n<td class=def><span class=field>(.*)<\/span><\/td>

但请注意,正则表达式是解析 HTML 的一种非常糟糕的方法 - 大多数语言中的 HTML 解析器做得更好。

而且您的正则表达式非常详细,因此很脆弱;额外的空间会导致它失败。

请注意,在 Windows 中,换行符通常是使用回车符和换行符组合创建的\r\n

这是一个提供Multiline选项的示例:

Dim rex As New Regex("\bsomething\b", RegexOptions.MultiLine)

正则表达式选项:MSDN

于 2013-09-23T23:27:54.860 回答
0
Here I write perl code but in if condition ,used \n new line character not match  



  #!/usr/bin/perl
    use strict;
    #use warnings;
    use Cwd;
    use File::Basename;
    use File::Copy;

    my $path=getcwd;    
    #print $path."\n";
    opendir(INP, "$path\/");
    my @out = grep(/.(xml)$/,readdir(INP));
    close INP;
    #print @out;
    open(F6, ">Log.txt");
    foreach my $f1(@out)
    {
        open(FF, "<$path\/$f1") or die "Cannot open file: $out[0]";
        my $data1 = join("", <FF>); 
        my @FILE_KA_ARRAY = split(/\n/, $data1);
        my $file_ka_len = @FILE_KA_ARRAY;
        #print F6 $file_ka_len."\n";
        #print F6 $f."\t".$file_ka_len."\n";
        print F6 $f1."\n";
        for(my $x=1; $x<$file_ka_len; $x++)
        {   
            my $y=$x+1;
            my $temp_file_arr = ""; 
            $temp_file_arr = $FILE_KA_ARRAY[$x];
        #print F6 $temp_file_arr."\t$x\n";
        my $temp1=$temp_file_arr;
    if($temp1=~m#(<list .*? depth="(\d+)">)\n?(<list .*? depth="(\d+)">)#gs)
    {
    my $list3=$1;
    print F6 "\t\t\t\t\t\t\t\t".$y."\t\t".$list3."\n";
    }
    }
    }
于 2015-11-03T10:42:56.750 回答