我需要从java字符串标记器中获取一个子字符串

我需要从java字符串标记器中获取一个子字符串,java,string,netbeans,substring,tokenize,Java,String,Netbeans,Substring,Tokenize,我需要从java字符串标记器获取子字符串 我的输入字符串是=Pizza-1*Nutella-20*Chicken-65* StringTokenizer productsTokenizer = new StringTokenizer("Pizza-1*Nutella-20*Chicken-65*", "*"); do { try { int pos = products

我需要从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
我需要单独变量中的乘积值和计数值,以便在数据库中插入这些值


我希望您能帮助我。

您可以使用
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]);
}
输出

调用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
}   

也就是说,不要假设存在令牌。

如果您的输入增加,您可能希望使用的替代答案:

// 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);
}

有些人不喜欢正则表达式,但这对他们来说是一个很好的应用程序。您只需要使用
“(\\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)); 
    }
为了进一步解释这一点,
“(\\w+)-(\\d+\\\*”
查找
(\\w+)
,它是
[a-Za-z0-9\\/code>中至少一个字符的任意集合,后跟一个
-
,后跟一个数字
\\d+
,其中
+
表示长度至少一个字符,后跟一个
*
,必须逃脱。括号表示它们的内部内容。此正则表达式中有两组捕获括号,因此我们通过
组(1)
组(2)
引用它们,如
while
循环中所示,该循环打印:

Pizza 1
Nutella 20
Chicken 65

为什么不简单地用空格替换
*
-
?您真的不应该使用
字符串标记器
,因为它的Javdocs状态是这样的。@marounnaroun不,因为我需要将乘积和计数放在单独的变量中,在我必须将该值插入DB之后。不确定您是否熟悉正则表达式,但这对他们来说是一个很好的应用。如果您感兴趣,请查看我的答案。@darthlitox别忘了将答案标记为正确答案:)@darthlitox不客气。如果这能解决您的问题,请务必接受答案。谢谢
Pizza 1
Nutella 20
Chicken 65