微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

什么正则expression式提取所有的数据,除了在<>在Perl中?

我有string

Message <Network=Data Center> All Verified

我需要提取除括号之外的所有string

我试过了

m/(?![^<]*\>)/s

没有给出预期的结果。

我怎样才能取代在Linux中的特定文件夹中find的所有电子邮件地址

Linux正则expression式匹配非常大的文件没有换行符后添加新行

除了白名单,Nginx全部改写为index.PHP

如何使用linux的csplit来砍断大量的XML文件

在.htaccess中删除GET参数

在C中转换转义序列

使用perl而不是grep

如何用空格列出所有文件后面的PHP标签

在.htaccess中为带有后缀的所有url设置redirect

当扩展正则expression式(ERE)选项与sed一起使用时,为什么美元不符合字面美元?

删除<..>区域

从字符串中删除<..>部分,然后处理剩下的字符串更容易。

试试这个oneliner:

cat file | perl -pne 's/<[^>]*?>//g;'

对于您的示例输入,这是输出

Message All Verified

注意非贪婪的量词 ? 在正则表达式中使用。 另外,因为这是一个oneliner,所以s/// search-and-replace结构被应用于$_隐式变量(这是一个来自标准输入的行)。 所以在搜索和替换运行后, $_将被改变(将不会有<..>区域)。 另外,为了在运行代码块之后打印变量$_ ,还使用了-p 。 您可以在perlrun中阅读关于Perl命令行开关的更多信息。

这是一个解决方案。 下面还有一个

捕获<..>之外的区域

另一方面,你可以(如果你想)匹配<..>区域以外的部分。

为了做到这一点,让我们建立一个正则表达式。 首先,我们要一个<或>自由区域。 下面的正则表达式匹配

$p = ([^<>]*) 。

接下来,我们希望在<之前匹配所有内容,为此我们可以编写(?:$p<)和>之后的所有内容,即(?:>$p) 。

现在,如果我们将所有这些部分组合在一起,我们得到(?:>$p)|(?:$p<) 。

注意(?:)是一个非捕获组。

所以现在有两个捕获组(两个$p你看到上面),但只有一个将匹配一次,所以一些捕获将是undef 。 我们将不得不将这些过滤掉。

最后,我们可以组装所有的捕获,我们就完成了。

cat file | perl -ne '$p="([^<>]*)";@x=grep{defined} m{(?:>$p)|(?:$p<)}g; print join(" ",@x)."n";'

Parse::Yapp解析器

你可能会认为使用Parser::Yapp这个特定的问题有点太多了(通常,如果你有一些复杂的解析,你会使用语法和解析器生成器 ),但..为什么不.. ..

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐