Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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 Perl正则表达式匹配嵌入的标记一次_Regex_Perl - Fatal编程技术网

Regex Perl正则表达式匹配嵌入的标记一次

Regex Perl正则表达式匹配嵌入的标记一次,regex,perl,Regex,Perl,我有一些文字,我想根据标签匹配只出现一次。 文本如下(一些随机字符可以包含除标记以外的任何内容): 一些随机字符数随机字符数随机字符数随机字符数随机字符数随机字符数 一些随机字符 一些随机字符随机字符随机字符随机字符 一些随机字符一些随机字符 一些随机字符 一些随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组 一些随机化字符数随机化字符数随机化字符数随机化字符数随机化字符数随机化字符数 一些随机字符随机字符随机字符随机字符随机字符随机字符 我

我有一些文字,我想根据标签匹配只出现一次。 文本如下(一些随机字符可以包含除标记以外的任何内容):

一些随机字符数随机字符数随机字符数随机字符数随机字符数随机字符数
一些随机字符
一些随机字符随机字符随机字符随机字符
一些随机字符一些随机字符
一些随机字符
一些随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组
一些随机化字符数随机化字符数随机化字符数随机化字符数随机化字符数随机化字符数
一些随机字符随机字符随机字符随机字符随机字符随机字符
我想要的匹配是:匹配tag2中只出现一次的tag3

例如:

<tag2><tag3>something</tag3></tag2> is matched
<tag2><tag3>something</tag3><tag3>something</tag3></tag2> isn't matched
有些东西是匹配的
有些东西有些东西不匹配
根据以上文本,预期输出为:第2行和第5行

我尝试的正则表达式(不起作用):

(*)?
(.*){1}

您的正则表达式不起作用,因为您允许捕获组中的所有内容(
)。这是非常贪婪的,并且会尽可能地进行,并且只在最后一个
处停止。如果只想匹配不能包含标记的内容,则需要匹配除开始标记令牌之外的任何内容

m{<tag2><tag3>([^<]+)</tag3></tag2>}g

m{([^使用支持XML的工具。我在中尝试了以下方法,使用包装器:

在将行号添加到tag2之后,我得到了

<tag2>2<tag3>Some randome chars</tag3></tag2>
<tag2>5<tag3>Some randome chars</tag3></tag2>
2一些随机字符
5一些随机字符

我建议您永远不要使用正则表达式来处理XML。正则表达式无法处理XML这样的上下文语言,因此您会生成脆弱的代码,对XML格式进行完全有效的更改(如空格)可能会破坏这些代码

因此:

#!/usr/bin/env perl
use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig->parse( \*DATA );

foreach my $element ( $twig->get_xpath('//tag2') ) {
   if ( scalar $element->children('tag3') == 1 ) {
      $element->print;
      print "\n";
   }
}

__DATA__
<root>
<tag1><tag2><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3></tag2></tag1>
<tag1><tag2><tag3>Some randome chars</tag3></tag2></tag1>
<tag1><tag2><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3></tag2></tag1>
<tag1><tag2><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3></tag2></tag1>
<tag1><tag2><tag3>Some randome chars</tag3></tag2></tag1>
<tag1><tag2><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3></tag2></tag1>
<tag1><tag2><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3></tag2></tag1>
<tag1><tag2><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3><tag3>Some randome chars</tag3></tag2></tag1>
</root>
!/usr/bin/env perl
严格使用;
使用警告;
使用XML::Twig;
my$twig=XML::twig->parse(\*数据);
foreach my$元素($twig->get_xpath('//tag2')){
if(标量$element->children('tag3')==1){
$element->print;
打印“\n”;
}
}
__资料__
一些随机字符随机字符随机字符随机字符随机字符随机字符
一些随机字符
一些随机字符随机字符随机字符随机字符
一些随机字符一些随机字符
一些随机字符
一些随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组
一些随机化字符数随机化字符数随机化字符数随机化字符数随机化字符数随机化字符数
一些随机字符随机字符随机字符随机字符随机字符随机字符
这将按照您的方式处理XML格式,但也仅在一行上处理。或者类似于:

<root>
  <tag1>
    <tag2>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
    </tag2>
  </tag1>
  <tag1>
    <tag2>
      <tag3>Some randome chars</tag3>
    </tag2>
  </tag1>
  <tag1>
    <tag2>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
    </tag2>
  </tag1>
  <tag1>
    <tag2>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
    </tag2>
  </tag1>
  <tag1>
    <tag2>
      <tag3>Some randome chars</tag3>
    </tag2>
  </tag1>
  <tag1>
    <tag2>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
    </tag2>
  </tag1>
  <tag1>
    <tag2>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
    </tag2>
  </tag1>
  <tag1>
    <tag2>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
    </tag2>
  </tag1>
</root>
<root
><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1></root>

一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
一些随机字符
或者像这样:

<root>
  <tag1>
    <tag2>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
    </tag2>
  </tag1>
  <tag1>
    <tag2>
      <tag3>Some randome chars</tag3>
    </tag2>
  </tag1>
  <tag1>
    <tag2>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
    </tag2>
  </tag1>
  <tag1>
    <tag2>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
    </tag2>
  </tag1>
  <tag1>
    <tag2>
      <tag3>Some randome chars</tag3>
    </tag2>
  </tag1>
  <tag1>
    <tag2>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
    </tag2>
  </tag1>
  <tag1>
    <tag2>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
    </tag2>
  </tag1>
  <tag1>
    <tag2>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
      <tag3>Some randome chars</tag3>
    </tag2>
  </tag1>
</root>
<root
><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1></root>
一些随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组一些随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组随机字符组

在语义上与您的相同。

可能重复的是XML、HTML还是类似的东西?重复可能有效,但也有一些情况下,实用正则表达式是可以的。我不知道这是否重要,标记可以是任何特殊字符,所以对我来说这是正则表达式的问题。这是XML btw:)还有,我们是在谈论PCRE正则表达式,还是你有一个真正的Perl程序?@Sobrique如果它是一个像这样简单的模式,并且输入文件的格式总是一样的,在我看来,基于正则表达式的解决方案是完全可以的。有时候,务实也可以。干杯,@simbabque,你完全正确。我还制定了一个解决方案:(?!tag)。)*谢谢Sobrique,这可能也行,但我的实际情况有点复杂,不是某种翻译的XML映射。你在评论中说你正在使用XML。如果是,那么随着复杂度的增加,XML解析器的情况也会变得复杂。
<root
><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1><tag1
><tag2
><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3><tag3
>Some randome chars</tag3></tag2></tag1></root>