Regex 需要在同一行中匹配多个模式-Perl

Regex 需要在同一行中匹配多个模式-Perl,regex,perl,Regex,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个字符串,它们之间总是用

我需要在同一行中匹配多个图案。例如,在此文件中:

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;
试试这个

这也是你所期望的

use strict;
use warnings;
open('new',"file.txt");
my @z =map{m/\[[\w;\s]+\]/g} <new>;
print "$_ ,",foreach(@z);

实际上,您需要匹配由分隔符分隔的单词;在[]范围内

你的意思是\[^;\n]*?:;[^;\n]*+\]'你想做什么,把它们放到一个数组中?@AvinashRaj我试过这个如果$句子=~/\[^;]*?:;[^;]*+\]/g{print$1.\n;}但是第一行的结果是:[McAllister;科学家]住在波士顿[马萨诸塞州;美国;芬威公园]@sln为什么不。最后,我需要将每个由分号分隔的值与字符串进行比较。我把答案编辑得更清楚。
use strict;
use warnings;
open('new',"file.txt");
my @z =map{m/\[[\w;\s]+\]/g} <new>;
print "$_ ,",foreach(@z);