2012-02-29 8 views
0

正規表現の有無にかかわらず、下記の2つのタスクをどのように達成するかを比較してください。問題:;何度も繰り返される特定のグループをキャプチャするため

SMSベースの食品の配達のための形式は次のようになります。

PABUSOGスラッシュまたはカンマ量は数値のみ可能

// @無限の回数を繰り返しました。簡略化のために、量は常に整数であると仮定する。

PABUSOG STRFRY_SMAI/En311

@ 2 HSHBRWN_BRGR/1 COFEEFLT/1、それは次のことをキャプチャします:

STRFRY_SMAI - 2 HSHBRWN_BRGR - 1 COFEEFLT - 1

これは私のサンプルコードです://やっ正規表現

String message = "PABUSOG ASD_ASD/1 ASD_ASA/2"; 

    Pattern pattern = Pattern.compile("PABUSOG(\\s+([A-Z]+_[A-Z]+)(/|,)([0-9]))+" 
      ,Pattern.CASE_INSENSITIVE); 

    Matcher m = pattern.matcher(message); 

    try 
    { 
     if (m.matches()) 
     { 

      String food = m.group(2); 
      String quantity = m.group(4); 

      System.out.println(food + " -- " + quantity + "\\n"); 


     } 
    } 
    catch (NullPointerException e) 
    { 
    } 

ではASD_ASA表示 - 2を、それがASD_ASD/1である第1を上書き。

それは

ASD_ASD表示しなければなりません - 1

ASD_ASA - 2

答えて

2

あなたはあなたのグループ内のすべてのデータを与えて、単一の正規表現でそれを達成することはできませんが。そして、複雑な正規表現の必要もありません。しかし、正規表現を好む場合は、パターンを繰り返し検索してみてください。あなたがString APIを使用して次の操作を行うことができ、複雑な正規表現がなければ

if (!message.startsWith("PABUSOG")) { 
    return; 
} 

Pattern pattern = Pattern.compile("([A-Z_]+)[/,]([0-9])+", Pattern.CASE_INSENSITIVE); 

Matcher m = pattern.matcher(message); 
while (m.find()) { 
    String food = m.group(1); 
    String quantity = m.group(2); 

    System.out.println(food + " -- " + quantity); 
} 

// Check for correct header 
if (!message.startsWith("PABUSOG")) { 
    return; 
} 

// split by whitespaces 
String[] items = message.split("\\s+"); 
// skip header and iterate over remaining items 
for (String item : Arrays.asList(items).subList(1, items.length)) { 
    // split each item by/or , 
    String[] foodQuantity = item.split("[/,]"); 
    assert foodQuantity.length == 2; 

    String food = foodQuantity[0]; 
    String quantity = foodQuantity[1]; 

    System.out.println(food + " -- " + quantity); 
} 

を項目をスキップするには、あなたがループまたは制限subList

if (item.startsWith("@")) { 
    break; // or continue if it can be not the last 
} 

を追加することができますいずれか@で開始しましたそのようなアイテムが常に存在し、シーケンスを終了することを確信するならば、次のようにしてください:Arrays.asList(items).subList(1, items.length - 1)

ところで、あなたのパターン[A-Z]+_[A-Z]+はあなたの例のCOFEEFLTと一致しません。

+0

は動作していないようです。 – tddiaz

+0

あなたの例を使って作業する必要があります。 Groovy Consoleでこれをチェックしたのでコンパイルに問題が生じることがありますが、その原則は正しいです。これらのスニペットではどのような問題が発生しましたか? – Rorick

+0

TestNG Javaユニットテストでチェックしました。両方のスニペットは、2つの例で動作します。 2番目のスニペットは答えが – Rorick

関連する問題