[英]Need to match multiple pattern in the same line - Perl
我需要在同一行中匹配多個模式。 例如,在此文件中:
Hello, Chester [McAllister;Scientist] lives in Boston [Massachusetts;USA;Fenway Park] # McAllister works in USA
I'm now working in New-York [NYC;USA] # I work in USA
...
首先,我想將每個字符串都匹配到括號中,因為知道可能有不止一種模式,而且我們可以將1到n個字符串始終用分號隔開。
最后,對於每一行,我需要將值與#
之后的字符串進行比較。 例如在第一句話中,我想比較一下:
[McAllister;Scientist] & [Massachusetts;USA;Fenway Park] TO "McAllister works in USA"
最簡單的方法可能是使用正則表達式查找所有由方括號定界的嵌入序列,然后使用帶有split
map
將這些序列分成術語。
該程序演示。
請注意,我假設文件中的所有數據都已讀入單個標量變量。 您可以將其更改為一次只處理一行,但前提是方括號中的子序列永遠不會拆分成多行
use strict;
use warnings;
my $s = <<END_TEXT;
Hello, Chester [McAllister;Scientist] lives in Boston [Massachusetts;USA;Fenway Park] # McAllister works in USA
I'm now working in New-York [NYC;USA] # I work in USA
END_TEXT
my @data = map [ split /;/ ], $s =~ / \[ ( [^\[\]]+ ) \] /xg;
use Data::Dump;
dd \@data;
輸出
[
["McAllister", "Scientist"],
["Massachusetts", "USA", "Fenway Park"],
["NYC", "USA"],
]
嘗試這個
這也給出了您的期望。
use strict;
use warnings;
open('new',"file.txt");
my @z =map{m/\[[\w;\s]+\]/g} <new>;
print "$_ ,",foreach(@z);
您實際上需要匹配用;
分隔的單詞;
在[]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.