【问题标题】:Extracting a parts of a long string.提取长字符串的一部分。
【发布时间】:2016-08-24 13:12:39
【问题描述】:

我有一个字符串如下:

FX1511237205/162370000000933.00/1/Train,Train.Time:1:1=MysoreExp,Station:1:1=Cantonment,
Carts.AC:1:1=05,Currency.Transaction:1:1=INR,Station.Destination:1:1=Bangalore City,
Total.Fare:1:1=35.00,Date.Booked:1:1=20150422,Date.Travel:1:1=20160517,Seat.Remaining:1:1=4,
Food:1:1=Veg North }North Indian Food  &{at Station Bangalore city,
Accomodation:1:1=Hotel Booking }Hotel Booking is not &{done,
Travel:1:1=Cab}Destination  &{Hotel  Capitol,No.Passenger:1:1=5,Booking:1:1=Success

它在一行中(为了便于理解,我做了上述安排)。我只需要提取这些

Food:1:1=Veg North }North Indian Food  &{at Station Bangalore city,
Accomodation:1:1=Hotel Booking }Hotel Booking is not & &{done{ for anydate,
Travel:1:1=Cab}Destination  &{Hotel  Capitol

那就是它有流动的格式。

<fields>:<SomeNumber>:<SomeNumber>=<Id>}<Message><&amp>;{<values>,<values>

注意:& 可以出现一次或多次。

我尝试过模式匹配。

String line="FX1511237205/IFTEST162370000000933.00/1/FOREX,DEAL.TYPE:1:1=SP,COUNTERPARTY:1:1=100471,DEALER.DESK:1:1=00,CURRENCY.MARKET:1:1=1,CURRENCY.BOUGHT:1:1=USD,AMOUNT.BOUGHT:1:1=10.00,VALUE.DATE.BUY:1:1=20150422,CURRENCY.SOLD:1:1=GBP,AMOUNT.SOLD:1:1=5.41,VALUE.DATE.SELL:1:1=20150422,SPOT.RATE:1:1=1.85,LIMIT.REFERENCE.NO:1:1=1010.01,POSITION.TYPE.BUY:1:1=TR,POSITION.TYPE.SELL:1:1=TR,DEAL.DATE:1:1=20150422,SPOT.DATE:1:1=20150424,BASE.CCY:1:1=GBP,SPOT.LCY.AMOUNT:1:1=10.00,OUR.ACCOUNT.PAY:1:1=23701,OUR.ACCOUNT.REC:1:1=23752,DEL.DATE.BUY:1:1=20150422,DEL.AMOUNT.BUY:1:1=10.00,DEL.DATE.SELL:1:1=20150422,DEL.AMOUNT.SELL:1:1=5.41,CPARTY.CORR.NO:1:1=120048,PAY.ACC.POSTED:1:1=00:15:33 24 AUG 2016,REC.ACC.POSTED:1:1=00:15:33 24 AUG 2016,BUY.LCY.EQUIV:1:1=-10.00,SEL.LCY.EQUIV:1:1=10.00,SWIFT.COMMON.REF:1:1=BOFA330185DEMOPX,CATEGORY.CODE:1:1=20010,FX.GROUP.COND.ID:1:1=999,ACCOUNT.OFFICER:1:1=5,FED.FUNDS:1:1=C,SEND.CONFIRMATION:1:1=NORMAL,SEND.PAYMENT:1:1=NORMAL,SEND.ADVICE:1:1=NORMAL,TRANSACTION.TYPE:1:1=SP,NETTING.STATUS:1:1=N,AMORTISE.POSITION:1:1=NO,SOD.MAT:1:1=NO,CLS.DEAL:1:1=NO,PRE.UTI.ID.1:1:1=VAL,PRE.UTI.ID.2:1:1=FX-SPOT.RATE.EXCEEDS.TOLERANCE}SPOT RATE EXCEEDS TOLERANCE BY &amp;{25.54%,EXEC.TIME.STAMP:1:1=INAU,CP.TRADE.PURPOSE:1:1=1,TRADE.REPOSITORY:1:1=52379_INPUTTER__OFS_IFPA,UNIQUE.PROD.ID:1:1=1608240015,RESERVED9:1:1=GB0010001,RESERVED8:1:1=1";   
String startpattern="";
String pattern="(.*)(=)(.*)";
Pattern r = Pattern.compile(pattern);    
Matcher m = r.matcher(line);
if (m.find( )) {
   System.out.println("Found value: " + m.group(0) );      
} else {
   System.out.println("NO MATCH");
}

它占据了整条线。我如何使它更精确。

【问题讨论】:

  • ^ 快速测试并没有给我任何结果......没有太多时间来找到可以工作的正则表达式,但考虑一下正则表达式测试网站来构建你的,OP( regex101.com 例如)
  • 类似this?
  • @AlexandreBeaudet,感谢您的网站。以前从未听说过。
  • @ThomasAyoub,它有效,我添加了几个条件以使其准确,谢谢。

标签: java regex pattern-matching


【解决方案1】:

试试这个代码

String line="FX1511237205/162370000000933.00/1/Train,Train.Time:1:1=MysoreExp,Station:1:1=Cantonment,Carts.AC:1:1=05,Currency.Transaction:1:1=INR,Station.Destination:1:1=Bangalore City,Total.Fare:1:1=35.00,Date.Booked:1:1=20150422,Date.Travel:1:1=20160517,Seat.Remaining:1:1=4,Food:1:1=Veg North }North Indian Food  &amp;{at Station Bangalore city,Accomodation:1:1=Hotel Booking }Hotel Booking is not &amp;{done,Travel:1:1=Cab}Destination  &amp;{Hotel  Capitol,No.Passenger:1:1=5,Booking:1:1=Success";   
String pattern="(\\w+:\\d+:\\d+\\=[\\w|\\s]+\\}[\\w|\\s|\\&|\\;]+\\{[\\w|\\s]+\\,)";
Pattern r = Pattern.compile(pattern);    
Matcher m = r.matcher(line);

if (m.find()) {
    System.out.println(m.group());
    while (m.find( )) {
        System.out.println(m.group());      
    }
}
else {
    System.out.println("NO MATCH"); 
}

它产生以下输出

Food:1:1=Veg North }North Indian Food  &amp;{at Station Bangalore city,
Accomodation:1:1=Hotel Booking }Hotel Booking is not &amp;{done,
Travel:1:1=Cab}Destination  &amp;{Hotel  Capitol,

【讨论】:

    猜你喜欢
    • 2020-12-18
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多