3

Java 文字列トークナイザから部分文字列を取得する必要があります。

私の入力文字列は = Pizza-1*Nutella-20*Chicken-65*

        StringTokenizer productsTokenizer = new StringTokenizer("Pizza-1*Nutella-20*Chicken-65*", "*");
        do
        {
            try
            {
                int pos = productsTokenizer .nextToken().indexOf("-");
                String product = productsTokenizer .nextToken().substring(0, pos+1);
                String count= productsTokenizer .nextToken().substring(pos, pos+1);
                System.out.println(product + "   " + count);
            }
            catch(Exception e)
            {

            }
        }
        while(productsTokenizer .hasMoreTokens());

私の出力は次のとおりです。

Pizza  1
Nutella  20
Chicken  65

その値をデータベースに挿入するには、製品値とカウント値を別々の変数に入れる必要があります。

あなたが私を助けてくれることを願っています。

4

4 に答える 4

3

String.split()次のように使用できます

String[] products = "Pizza-1*Nutella-20*Chicken-65*".split("\\*");

for (String product : products) {
    String[] prodNameCount = product.split("\\-");
    System.out.println(prodNameCount[0] + " " + prodNameCount[1]);
}

出力

Pizza  1
Nutella  20
Chicken  65
于 2013-06-18T21:12:37.857 に答える
0

nextToken() メソッドを 3 回呼び出します。それはあなたに3つの異なるトークンを取得します

int pos = productsTokenizer .nextToken().indexOf("-");
String product = productsTokenizer .nextToken().substring(0, pos+1);
String count= productsTokenizer .nextToken().substring(pos, pos+1);

代わりに、次のようにする必要があります。

String token = productsTokenizer .nextToken();
int pos = token.indexOf("-");
String product = token.substring(...);
String count= token.substring(...);

substring() メソッドの適切なインデックスを理解させます。

また、do/while 構造を使用する代わりに、while ループを使用することをお勧めします。

while(productsTokenizer .hasMoreTokens())
{
    // add your code here
}   

それは、トークンがあると仮定しないでください。

于 2013-06-18T21:28:59.813 に答える
0

入力が大きくなった場合に使用する別の回答:

// find all strings that match START or '*' followed by the name (matched),
// a hyphen and then a positive number (not starting with 0)
Pattern p = Pattern.compile("(?:^|[*])(\\w+)-([1-9]\\d*)");
Matcher finder = p.matcher(products);
while (finder.find()) {
    // possibly check if the new match directly follows the previous one
    String product = finder.group(1);
    int count = Integer.valueOf(finder.group(2));
    System.out.printf("Product: %s , count %d%n", product, count);
}
于 2013-06-18T21:45:16.990 に答える
0

正規表現が嫌いな人もいますが、これは彼らにとって良いアプリケーションです。使用する必要があるのは"(\\w+)-(\\d{1,})\\*"、パターンとしてだけです。おもちゃの例を次に示します。

    String template = "Pizza-1*Nutella-20*Chicken-65*";
    String pattern = "(\\w+)-(\\d+)\\*";

    Pattern p = Pattern.compile(pattern);
    Matcher m = p.matcher(template);

    while(m.find())
    {
        System.out.println(m.group(1) + " " + m.group(2)); 
    }

これをもう少し説明すると、 は、 からの少なくとも 1 文字の任意のセットである を"(\\w+)-(\\d+)\\*"検索し、その後に が続き、その後に 数字 が続きます。ここで、は少なくとも 1 文字の長さを意味し、その後に が続きます。これはエスケープする必要があります。かっこは、その中にあるものをキャプチャします。この正規表現にはキャプチャ用の括弧が 2 セットあるため、ループで見られるようにandでそれらを参照すると、次のように表示されます。(\\w+)[A-Za-z0-9_]-\\d++*group(1)group(2)while

Pizza 1
Nutella 20
Chicken 65
于 2013-06-18T21:51:00.693 に答える