我有一个字符串如下:
“这是@awesome @dude”
从这个字符串我想提取真棒和花花公子并创建一个字符串
output==> "awesome,dude"
所以我的代码如下:
Matcher matcher = Pattern.compile("(?<=@)\\w+").matcher(textStr);
while (matcher.find()){
mergedStr += matcher.group() +",";
}
但这会在最后创造一个神器
output==> "awesome,dude," //<-- egghh comma.. in the end
解决这个问题的更好方法是什么。
答案 0 :(得分:3)
另一种方法:
boolean needComma = false;
while (blah, blah, blah) {
if (needComma) {
string += ",";
}
string += word;
needComma = true;
}
但是有十几种不同的方法。
答案 1 :(得分:1)
这是一个选择:
Matcher matcher = Pattern.compile("(?<=@)\\w+").matcher(textStr);
while (matcher.find()){
if (!mergedStr.isEmpty())
mergedStr += ",";
mergedStr += matcher.group();
}
答案 2 :(得分:1)
这是另一种常见方法:
Matcher matcher = Pattern.compile("(?<=@)\\w+").matcher(textStr);
StringBuilder sb = new StringBuilder();
while (matcher.find()){
sb.append(matcher.group()).append(",");
}
return sb.toString().replaceAll(",$", "");
如果您不想使用正则表达式,可以这样做:
Matcher matcher = Pattern.compile("(?<=@)\\w+").matcher(textStr);
StringBuilder sb = new StringBuilder();
while (matcher.find()){
sb.append(matcher.group()).append(",");
}
if (sb.length() == 0) {
return "";
}
else {
return sb.toString().substring(0, sb.length() - 1);
}
答案 3 :(得分:1)
我经常用于此类事情的有用模式是附加第一个项目,然后追加前面有分隔符的项目的其余部分。这样可以避免在循环或后处理中删除不必要的条件以删除尾随分隔符。
我知道,微优化等等,等等,地狱的第六圈,等等,等等,但只是为了你的娱乐而包括在内:
Matcher matcher = Pattern.compile("(?<=@)\\w+").matcher(textStr);
StringBuilder mergedStr = new StringBuilder();
if (matcher.find()) {
mergedStr.append(matcher.group());
while (matcher.find()) {
mergedStr.append(',').append(matcher.group());
}
}
return mergedStr.toString();
另外,我并不是100%确信用线性算法(StringBuilder
)替换二次算法(字符串连接)在严格意义上是微观优化。
答案 4 :(得分:0)
String input = "@awesome@dude";
List<String> strSplit = new ArrayList<String>();
String result = "";
Matcher matcher = Pattern.compile("(?<=@)\\w+").matcher(input);
while (matcher.find()){
strSplit.add(matcher.group());
}
for(int j = 0; j< strSplit.size(); j++){
result = result + strSplit.get(j);
if(j < strSplit.size() -1){
result = result+",";
}
}
System.out.println("Result : " + result);