如何匹配指定字符之间的模式?

时间:2011-03-23 10:15:00

标签: regex perl

我有一个由“|”分隔的固定消息... tag = value是分隔符之间的对;

  

(8=FIX.4.2|9=0360|35=8|49=BLPFT|56=ESP|34=8415|52=20110201-15:59:59|50=MBA|143=LN|115=MSET|57=2457172|30=CHIX|60=20110201-15:59:59.121|150=1|31=56.3100|151=71785|32=137|6=56.4058|37=9D9ZIhgu4BGU9sBtfHcYeQA|38=97370|39=1|40=1|11=20110201-05529|12=0.0012|13=2|14=25585|15=EUR|76=CHIXCCP|17=272674|47=A|167=CS|18=1|48=FR0000131104|20=0|21=1|22=4|113=N|54=1|55=BNP|207=FP|29=1|59=0|10=205|)

如何在“11 =”和第一次出现“|”之间提取数据比赛结束后?

例如我想要一个数据

  

20110201-05529

介于“| 11 =”和“|”之间

你能告诉我正则表达式吗?

3 个答案:

答案 0 :(得分:1)

最佳方法取决于您对要匹配的数据的了解程度。如果你知道它只包含数字和破折号:

m/11=([0-9\-]+)/

相反,如果数据可以包含任何类型的字符,请使用:

m/11=([^|]+)/

匹配不是管道符的任何内容。这可能是最可靠的表达方式。

在这两种情况下,您想要的数据都会被捕获到$1特殊变量中。

如果您不总是希望匹配键11的值,则可以在模式中使用变量,因此:

my $key = 42; # or any number
if ($text =~ m/$key=([^|]+)/) {
    print "I found $1"; # prints "I found 20110201-05529"
}

答案 1 :(得分:0)

与往常一样,解决问题的方法不止一种。因此,没有“正则表达式”这样的东西。 但你肯定希望perldoc分裂。

答案 2 :(得分:0)

像这样的东西将比其他所有东西都匹配,然后除了|

之外的其他东西
[^=]+=([^|])+