Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用正则表达式获取块列表中的文本块_Regex - Fatal编程技术网

Regex 使用正则表达式获取块列表中的文本块

Regex 使用正则表达式获取块列表中的文本块,regex,Regex,Edit2:请只提供正则表达式匹配解决方案。谢谢大家! 编辑:我正在寻找正则表达式解决方案,如果它存在的话。我还有其他块使用的数据不是XML,我不能使用Perl,我添加了Perl标记,因为我更熟悉Perl中的正则表达式。提前谢谢 我有这样的清单: <Param name="Application #" value="1"> <Param name="app_id" value="32767" /> <Param name="app_name" value=

Edit2:请只提供正则表达式匹配解决方案。谢谢大家!

编辑:我正在寻找正则表达式解决方案,如果它存在的话。我还有其他块使用的数据不是XML,我不能使用Perl,我添加了Perl标记,因为我更熟悉Perl中的正则表达式。提前谢谢

我有这样的清单:

<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;