Html perl-匹配大于正则表达式中的字符

Html perl-匹配大于正则表达式中的字符,html,regex,perl,Html,Regex,Perl,但这似乎对“>”符号不起作用 2) 也试过 ($string1=~ /\'>(.*?)/) {print "got $1";} 基于来自的输入,但它不起作用 任何输入都是有用的 另外,如果答案可以包括匹配“小于”符号(“这对我很有用 if ($string1=~ /(?=>)(.*?)/) {print "got $1";} 这对我有用 if ($string1=~ /(?=>)(.*?)/) {print "got $1";} .regex在解析复杂、平衡的文本(

但这似乎对“>”符号不起作用

2) 也试过

($string1=~ /\'>(.*?)/) {print "got $1";} 
基于来自的输入,但它不起作用

任何输入都是有用的

另外,如果答案可以包括匹配“小于”符号(“这对我很有用

if ($string1=~ /(?=>)(.*?)/) {print "got $1";} 
这对我有用

if ($string1=~ /(?=>)(.*?)/) {print "got $1";} 
.regex在解析复杂、平衡的文本(如HTML)方面非常糟糕

例如:

$ perl /tmp/abc.pl
got Alpha-Seeking
got No Underlying Index ,

外面的
中间的
内部的
中间的
外面的
相反,使用HTML解析器和搜索工具,如

下面是一个使用的演示

使用严格;
使用警告;
使用v5.10;
使用XML::LibXML;
我的$html=q{
};
#解析HTML
my$dom=XML::LibXML->load_html(字符串=>$html);
#查找所有链接。
对于我的$node($dom->findnodes('//a')){
#打印他们的文本。
说$node->textContent;
}
。正则表达式在解析复杂、平衡的文本(如HTML)方面非常糟糕

例如:

$ perl /tmp/abc.pl
got Alpha-Seeking
got No Underlying Index ,

外面的
中间的
内部的
中间的
外面的
相反,使用HTML解析器和搜索工具,如

下面是一个使用的演示

使用严格;
使用警告;
使用v5.10;
使用XML::LibXML;
我的$html=q{
};
#解析HTML
my$dom=XML::LibXML->load_html(字符串=>$html);
#查找所有链接。
对于我的$node($dom->findnodes('//a')){
#打印他们的文本。
说$node->textContent;
}

我必须重申,用正则表达式解析HTML或XML是非常不明智的。请考虑使用适当的HTML解析器。

话虽如此,您的问题很容易解决。您所谓的“标准直观方法”只需简单的调整就可以很好地工作

以下是您所拥有的:

use strict;
use warnings;
use v5.10;

use XML::LibXML;

my $html = q{
<html>
<body>
    <a href='/channels/folder1'>Alpha-Seeking</a>
    <a href='/channels/folder2'>No Underlying Index</a>
</body>
</html>
};

# Parse the HTML
my $dom = XML::LibXML->load_html(string => $html);

# Find all links.
for my $node ($dom->findnodes('//a')) {
    # Print their text.
    say $node->textContent;
}
您的正则表达式是
\'>(.*?
。这意味着“找到一个文字引号,后跟一个大于号,然后捕获后面的最小数量”。问题是“最小数量”。
*?
可以捕获的最简单的东西是空字符串

默认情况下,正则表达式是贪婪的;它们尽可能多地匹配。您添加
以删除贪婪,并使它们尽可能少地匹配。但您不希望在这里看到贪婪。在这里,您希望看到它们的贪婪。所以只需删除

if ($string1=~ /\'>(.*?)/) {print "got $1";} 

我必须重申,用正则表达式解析HTML或XML是非常不明智的。请考虑使用适当的HTML解析器。

话虽如此,您的问题很容易解决。您所谓的“标准直观方法”只需简单的调整就可以很好地工作

以下是您所拥有的:

use strict;
use warnings;
use v5.10;

use XML::LibXML;

my $html = q{
<html>
<body>
    <a href='/channels/folder1'>Alpha-Seeking</a>
    <a href='/channels/folder2'>No Underlying Index</a>
</body>
</html>
};

# Parse the HTML
my $dom = XML::LibXML->load_html(string => $html);

# Find all links.
for my $node ($dom->findnodes('//a')) {
    # Print their text.
    say $node->textContent;
}
您的正则表达式是
\'>(.*?
。这意味着“找到一个文字引号,后跟一个大于号,然后捕获后面的最小数量”。问题是“最小数量”。
*?
可以捕获的最简单的东西是空字符串

默认情况下,正则表达式是贪婪的;它们尽可能多地匹配。您添加
以删除贪婪,并使它们尽可能少地匹配。但您不希望在这里看到贪婪。在这里,您希望看到它们的贪婪。所以只需删除

if ($string1=~ /\'>(.*?)/) {print "got $1";} 

在探索各种选项的同时,我设法通过以下方式实现了这一点:

将大于号替换为其他通用符号(如管道)

之后,在管道字符上拆分,并打印/解析第二部分:

$string=~ s/>/\|/g;                 #Interestingly, '>' matches here without any issues

作为一种解决方法,它非常有效。

在探索各种选项的同时,我通过以下方法实现了这一点:

将大于号替换为其他通用符号(如管道)

之后,在管道字符上拆分,并打印/解析第二部分:

$string=~ s/>/\|/g;                 #Interestingly, '>' matches here without any issues


作为一种解决方法,效果非常好。

如果您删除
?@stevesliva,…这些引号很清楚。我修改了它们以发布此问题。已将原始问题编辑为双引号。您关于匹配的确切含义是什么?”如果您删除
?@stevesliva,…这些引号很清楚,那么您的第一次尝试会发生什么情况。我修改了它们以发布此问题。已将原始问题编辑为双引号。关于匹配,您到底指的是什么"感谢@schwern,这是可行的,尽管它需要一些解析来使用HTML解析器。感谢@schwern,这是可行的,尽管它需要一些解析来使用HTML解析器。感谢@pmqs,这是可行的,但HTML可以是多行的,如果失败的话。+1表示单行工作。@Aquaholic同意,但您的问题表明您正在处理一个单行用例:-)谢谢@pmqs,这是可行的,但如果失败,HTML可以是多行的+1用于单行工作。@Aquaholic同意,但您的问题表明您正在处理单行用例:-)谢谢@davecross,这是可行的,但如果失败,HTML可以是多行的+单线为1working@Aquaholic:如果您有更复杂的规范,那么最好在问题中提及它们,否则您将得到没有多大帮助的答案。如果要处理多行数据,则需要指定定义文本结尾的内容。已同意。只是在我发布了这个q之后,随着更多的数据被暴露,在这种情况下,它变成了额外的需要。以后会注意的。谢谢@davecross,这是可行的,但如果失败,HTML可以是多行的+单线为1working@Aquaholic:如果您有更复杂的规范,那么最好在问题中提及它们,否则您将得到没有多大帮助的答案。如果要处理多行数据,则需要指定定义文本结尾的内容。已同意。只是在我发布了这个q之后,随着更多的数据被暴露,在这种情况下,它变成了额外的需要。以后会注意的。有趣的是,“>”在这里匹配没有任何问题,但“>”总是匹配没有问题。问题从来不是出在“>”上,而是出在
(.*)
上。我以为我们
    ($o1,$o2) = split(/\|/, $string);
    print "$o2|";