我有一个不方便格式的字符串。这是一个例子:
(Air Fresheners,17)->(Chocolate Chips,14)->(Juice-Frozen,24)
我需要浏览此字符串并仅提取括号中的第一项。因此,使用上面的代码作为输入,我希望我的代码返回:
Air Fresheners
Chocolate Chips
Juice-Frozen
请注意,某些项目的项目名称中包含-
。这些应保留并包含在最终输出中。我试图使用:
Scanner.useDelimiter(insert regex here)
......但我没有运气。完成任务的其他方法很好,但请保持相对简单。
答案 0 :(得分:2)
我知道这已经过时了,我不是专家,但你不能使用replaceAll吗?如下:
String s = "(Air Fresheners,17)->(Chocolate Chips,14)->(Juice-Frozen,24)".replaceAll("(->)|[\\(\\)]|\\d+","");
for (String str : s.split(","))
{
System.out.println(str);
}
答案 1 :(得分:0)
(Air Fresheners,17) - >(Chocolate Chips,14) - >(Juice-Frozen,24)
您可以将其视为(和
之间的所有内容)所以,
\(.*?\,
会匹配“(Air Fresheners,”(这是为了让它变得非贪婪,并在看到逗号时停止)
所以,如果你热衷于使用正则表达式,那么只需匹配这些,并采用子字符串来摆脱(和,
答案 2 :(得分:0)
我首先要使用)->
作为分隔符。在每个scanner.next()
上使用子字符串去除第一个字符(括号),然后在该字符串上放置第二个扫描程序,使用,
作为分隔符。在代码中,这看起来像:
Scanner s1 = new Scanner(string).useDelimiter("\\s*)->\\s*");
while(s1.hasNext())
{
Scanner s2 = new Scanner(s1.next).useDelimiter("\\s*,\\s*");
System.out.println(s2.next.substring(1));
}
答案 3 :(得分:0)
试试这个
使用正则表达式进行拆分) - >(
String s="(Air Fresheners,17)->(Chocolate Chips,14)->(Juice-Frozen,24)";
Pattern regex = Pattern.compile("\\)->\\(");
Matcher regexMatcher = regex.matcher(s);
int i=0;
while (regexMatcher.find()) {
System.out.println(s.substring(i+1,regexMatcher.start()));
i=regexMatcher.end()-1;
}
System.out.println(s.substring(i+1,s.length()-1));
尝试String.split()
方法
String s = "(Air Fresheners,17)->(Chocolate Chips,14)->(Juice-Frozen,24)";
for (String str : s.substring(1, s.length() - 1).split("\\)->\\(")) {
System.out.println(str);
}
答案 4 :(得分:0)
这可以使用正则表达式完成。我们匹配的,\\d+\\)
匹配任何不包含括号或逗号的名称,,14)
匹配(?:->)?
部分,->
匹配可能 {{1在元组之后。我们使用group(1)来获取名称(group(0)返回整个元组(Air Fresheners,17)->
List<String> ans = new ArrayList<>();
Matcher m = Pattern.compile("\\(([^,)(]*),\\d+\\)(?:->)?").matcher(str);
while(m.find()){
String s = m.group(1);
ans.add(m.group(1));
}
给定(Air Fresheners,17)->(Chocolate Chips,14)->(Juice-Frozen,24)
,此程序返回[Air Fresheners, Chocolate Chips, Juice-Frozen]