Regex 使用正则表达式获取块列表中的文本块
Edit2:请只提供正则表达式匹配解决方案。谢谢大家! 编辑:我正在寻找正则表达式解决方案,如果它存在的话。我还有其他块使用的数据不是XML,我不能使用Perl,我添加了Perl标记,因为我更熟悉Perl中的正则表达式。提前谢谢 我有这样的清单:Regex 使用正则表达式获取块列表中的文本块,regex,Regex,Edit2:请只提供正则表达式匹配解决方案。谢谢大家! 编辑:我正在寻找正则表达式解决方案,如果它存在的话。我还有其他块使用的数据不是XML,我不能使用Perl,我添加了Perl标记,因为我更熟悉Perl中的正则表达式。提前谢谢 我有这样的清单: <Param name="Application #" value="1"> <Param name="app_id" value="32767" /> <Param name="app_name" value=
<Param name="Application #" value="1">
<Param name="app_id" value="32767" />
<Param name="app_name" value="App01" />
<Param name="app_version" value="1.0.0" />
<Param name="app_priority" value="1" />
</Param>
<Param name="Application #" value="2">
<Param name="app_id" value="3221" />
<Param name="app_name" value="App02" />
<Param name="app_version" value="1.0.0" />
<Param name="app_priority" value="5" />
</Param>
<Param name="Application #" value="3">
<Param name="app_id" value="32" />
<Param name="app_name" value="App03" />
<Param name="app_version" value="1.0.0" />
<Param name="app_priority" value="2" />
</Param>
如果我只知道(比如)app_name的值,我如何获得一个应用程序的块。例如,对于App02,我想获得
<Param name="Application #" value="2">
<Param name="app_id" value="3221" />
<Param name="app_name" value="App02" />
<Param name="app_version" value="1.0.0" />
<Param name="app_priority" value="5" />
</Param>
如果不知道其他“name=”行(但总是有name=“app_name”
和Param name=“Application#”
),是否可能获得它
它可以在单个正则表达式匹配中完成吗?(不必如此,但感觉可能有办法)。既然您的内容似乎是某种XML,为什么不使用真正的解析器来完成这项任务
use XML::XPath;
use XML::XPath::XMLParser;
my $xp = XML::XPath->new(filename => 'test.xhtml');
my $nodeset = $xp->find('/Param[@name=\'Application #\']'); # find all applications
foreach my $node ($nodeset->get_nodelist) {
print "FOUND\n\n",
XML::XPath::XMLParser::as_string($node),
"\n\n";
}
你可以在这里多读一点,在网站上有完整的参考资料
我建议您不要使用reg exp来执行该任务,因为它将非常复杂且不可维护
注意:也可以根据你最喜欢的那一个来使用 使用XML读取器库似乎更合适,但我对Perl的了解还不够,无法提出建议。Perl在这里可能更合适。这似乎是一个令人遗憾的例子。充其量只是一种误导性的尝试。开发人员可以使用sane配置文件格式,例如: [App03] app_id = 32767 app_version = 1.0.0 ...
将为您提供所有
名称
-值
对。我也更喜欢解析器解决方案。如果您必须使用正则表达式并理解此方法的所有缺点,那么以下正则表达式应该可以工作:
<Param name="Application #"[^>]*>\s+<Param[^>]*>\s+<Param name="app_name" value="App02" />\s+(?:<Param[^>]*>\s+){2}</Param>
]*>\s+]*>\s+\s+(?:]*>\s+{2}
这在很大程度上依赖于示例中的结构。重新排序标记、引入附加标记或(抖动)嵌套标记将破坏正则表达式。我建议使用一个XML解析器,但如果您不能这样做,那么下面的快速脏代码应该可以:
my ($rez) = $data =~/\<Param\s+name\s*=\s*"Application\s#"\s+value\s*=\s*"2"\>((?:.|\n)*?)^\<\/Param\>/m;
print $rez;
my($rez)=$data=~/\((?:.|\n)*?)^\/m;
打印$rez;
(假设$data将xml作为一个字符串包含,可能是多行的)噢,亲爱的。准备好迎接警察的袭击,这是理所当然的。这不适合正则表达式。为什么在谷歌地球上你想用正则表达式来做这个<代码>解析器策略正在寻找正则表达式解决方案。谢谢-1当我撰写我的答案时,这个问题有
perl
标记。现在,我发现你不能使用Perl,你已经编了一个标签。谢谢,但我正在寻找regex解决方案,如果它存在的话-在原文中进行了解释和编辑。+1不只是说咒语,而是提供代码。我理解你的解决方案的局限性,到目前为止,这是最接近我想要的。非常感谢。这取决于Application
的值,但我正在寻找app\u name
。但是谢谢你的解决方案。
<Param name="Application #"[^>]*>\s+<Param[^>]*>\s+<Param name="app_name" value="App02" />\s+(?:<Param[^>]*>\s+){2}</Param>
my ($rez) = $data =~/\<Param\s+name\s*=\s*"Application\s#"\s+value\s*=\s*"2"\>((?:.|\n)*?)^\<\/Param\>/m;
print $rez;