我需要从java字符串标记器中获取一个子字符串
我需要从java字符串标记器获取子字符串 我的输入字符串是=Pizza-1*Nutella-20*Chicken-65*我需要从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
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