【发布时间】:2019-11-06 17:02:28
【问题描述】:
我查看了其他成员提出的类似问题,并从他们的询问中应用(或尝试应用)解决方案,但他们没有解决我的问题。我的模式匹配和分组太贪心,不会在第一个管道(|)处停止。如果我变得更具体,我认为可以,但我想弄清楚如何在管道的第一个实例处停止模式匹配?
这里有几行
09:30:00.063|IN:|8=FIX.4.2|9=206|35=D|34=5159|49=CLIENT|52=20191024-13:30:00.050|56=SERV|57=DEST|1=05033|11=ABZ5702|15=USD|21=1|38=2000|40=2|44=92.48|47=A|54=5|55=RC|60=20191024-13:30:00.050|111=0|114=N|336=X|5700=AP|9281=SOV|10=202
09:37:21.208|IN:|8=FIX.4.2|9=170|35=D|34=5184|49=CLIENT|52=20191024-13:37:21.206|56=SERV|57=ATXB|1=J5129|11=136404|15=USD|21=1|38=100|40=2|44=1.39|47=A|54=2|55=DIW|59=2|60=20191024-13:30:00.206|10=029
我希望我的 perl 脚本从上述数据中返回以下输出:
09:30:00.063|13:30:00.050|ABZ5702
09:37:21.208|13:37:21.206|136404
我尝试了所有这些以及其他几个版本,但无法让它产生上述输出:
#$msg =~ s/([^|]*).*|52=([^|]*).*|11=([^|]*).*/$1|$2|$3/;
$msg =~ s/(.+)\|??.*|52=([^|]*).*|11=([^|]*).*/$1|$2|$3/;
#$msg =~ s/^([^|]*).??|52=([^|]*).??|11=([^|]*).*/$1|$2|$3/;
#$msg =~ s/^([^\|??]*).*|52=([^\|??]*).*|11=([^\|??]*).*/$1|$2|$3/;
#$msg =~ s/(.*\|??).*|52=(.+\|??).*|11=(.+\|??).*/one $1|two $2|three $3/;
#$msg =~ s/(.*?|).*|52=(.*?|).*|11=(.*|?).*/$1|$2|$3/;
#$msg =~ /(.*)|??.*|52=(.*)|??.*|11=(.*)|??.*/$1|$2|$3/;
#$msg =~ s/|.*-[0-3][0-9]:/|/;
print "$msg\n";```
我知道给猫剥皮的方法不止一种,但在某些情况下我需要使用模式匹配方法。我怎样才能让它使用模式匹配产生预期的输出,它在第一个管道(|)处停止每个组?有人可以告诉我我做错了什么吗?
【问题讨论】:
标签: perl regex-greedy fix-protocol