perl中每行有多个要匹配的字符串怎么取?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了perl中每行有多个要匹配的字符串怎么取?相关的知识,希望对你有一定的参考价值。

例如:“1232352》和罚款6899》浓咖啡7899》还记得”
想建一个hash,key是汉字,value为汉字前的数字,不过每行数字和对应汉字的组数不定,说不定下一行就只有:“689077》或更换i欧冠”一组

while(my $line=~/(\w+)?(\d+)?/gi)



其实你的需求写的很不明确。我不知道你是只需要抓取汉字+数字的 这种呢,还是只有汉字/数字的也需要抓取,如果只有汉字/数字 的,又怎么存放在一个哈希里。如果只匹配汉字+数字 就是(\w+)(\d+) 然后
把$1,$2,存到一个哈希里就行
参考技术A /模式匹配/g
这个小骆驼书上有的

正则表达式匹配多个字符串但不匹配特定字符串

【中文标题】正则表达式匹配多个字符串但不匹配特定字符串【英文标题】:Regex to match several strings but not specific ones 【发布时间】:2014-10-08 14:32:01 【问题描述】:

我正在使用 Perl 来搜索和匹配每行中符合条件的字符串,并希望省略包含特定字符串的行。 我的意思是: 假设我正在匹配字符串 Mouse,但如果该行匹配 X123Y,我想省略。任何一个字符串都可以在该行的任何位置找到。

*** Mouse forum.       <--Match
*** -Mouse- forum.     <--Match
*** X123Y forum Mouse. <--Should not Match
*** XYZ forum Mouse.   <--Should not Match

我希望这能解决它,因为我使用的是负前瞻,但似乎没有奏效。

(?i)(\WMouse\W|(?!(X123Y|XYZ)).*$)

我想我在做一些根本错误的事情,但现在看不到。

有什么帮助吗?

【问题讨论】:

【参考方案1】:

这个正则表达式应该适合你:

^(?=.*?Mouse)(?:(?!(?:X123|XYZ)).)*$

RegEx Demo

【讨论】:

只需查看演示链接中的正则表达式描述,了解有关此正则表达式的所有详细信息。之后,请随时提出任何问题,我会在这里回答。【参考方案2】:

您可以使用丢弃技术来保留您想要的内容并丢弃您不想要的模式。

例如,使用这个正则表达式:

.*X123Y.*|.*XYZ.*|(.*Mouse.*)

您将获取最正确模式的内容并丢弃其他模式..

Working demo

这个想法是使用:

discard patt 1 | discard patt 2 | discard patt n | (grab this pattern)

【讨论】:

以上是关于perl中每行有多个要匹配的字符串怎么取?的主要内容,如果未能解决你的问题,请参考以下文章

Perl中的多个模式的字符串匹配

正则表达式匹配多个字符串但不匹配特定字符串

查找文件中所有出现的字符串并在 Perl 中打印其行号

Perl 中的正则表达式组:如何从正则表达式组中捕获与字符串中出现的未知数量/多个/变量匹配的元素到数组中?

PHP正则表达式基本函数

使用 awk sub 以数字方式为字符串添加前缀而不更改计数状态最多 5 个匹配“在每行具有多个匹配项的文本文件中”