我正在考虑使用String.replaceAll()
删除字符串中的某些字符。目前还不清楚哪些字符将被删除(即我想删除哪些字符),但我认为任何字符都是有效的(如[a-zA-Z]
和$%!
之类的东西等)。
我遇到了http://www.java-tips.org/java-se-tips/java.lang/strip-certain-characters-from-a-string.html,但肯定有一种比迭代每个角色更好的方式......
对此有何想法?
由于
实施例
为了澄清,我会有不同长度的字符串。我想从中删除字符,确切的在运行时确定,然后返回结果字符串。
采用上面的段落并允许我删除“,.
”,我会返回字符串:
只是为了澄清我会有一些字符串 不同的长度,我想剥离 从中得到的字符 在运行时确定并返回 结果字符串
顺便说一句,我知道replaceAll()使用正则表达式,所以如果我想删除字符“$,。”,我也需要逃避它们,对吗?
答案 0 :(得分:17)
您可能希望首先指定要保留的字符,尝试类似:
"mystring".replaceAll("[^a-zA-Z]", "")
只保留信件。
答案 1 :(得分:13)
我猜,以下代码可以帮助您。
String input = "Just to clarify, I will have strings of varying "
+ "lengths. I want to strip characters from it, the exact "
+ "ones to be determined at runtime, and return the "
+ "resulting string.";
String regx = ",.";
char[] ca = regx.toCharArray();
for (char c : ca) {
input = input.replace(""+c, "");
}
System.out.println(input);
答案 2 :(得分:11)
这是正则表达式可能不是一个好主意的情况之一。你最终会编写更多特殊代码来解决正则表达式,而不是只采用简单的方法并迭代字符。您还可能会忽略某些可能在以后出现错误的案例。
如果你担心性能,正则表达式实际上要慢得多。如果您查看代码或配置文件的使用,正则表达式必须创建一个模式来解析/编译,运行匹配的逻辑,然后应用您的替换。所有这些都会产生很多对象,如果你经常迭代这些对象会很昂贵。
我会在那个链接上实现你所发现的东西。您可以节省不必要的String
分配,因为它构建结果时没有任何额外的复杂性:
public static String stripChars(String input, String strip) {
StringBuilder result = new StringBuilder();
for (char c : input.toCharArray()) {
if (strip.indexOf(c) == -1) {
result.append(c);
}
}
return result.toString();
}
答案 3 :(得分:10)
如果您已经在使用该库,Guava可以使用CharMatcher
轻松实现String charsToRemove = "%^#";
String stringToFilter = "I have 20% of my assets in #2 pencils! :^)";
String filtered = CharMatcher.anyOf(charsToRemove).removeFrom(stringToFilter);
答案 4 :(得分:2)
我认为这可以通过使用正则表达式来完成。
首先,我们知道[a-zA-Z]
和$%!
对字符串中的字符有效。因此我们使用regx "[^a-zA-Z0-9$%!]"
去除其他无效字符。
查看http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html以获取JAVA模式的详细信息。
接下来,我们可以使用mystring.replaceAll(String regex, String replacement)
P.S。 RefexPlanet在线正则表达式测试页面
答案 5 :(得分:1)
我认为您正在寻找这样的代码来解决您的问题 without any looping
:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StripChars {
public static void main(String[] args) {
// prints: Just to clarify I will have strings of varying lengths
System.out.println(
replace("Just to clarify, I will have strings of varying lengths.",
",."));
// prints: Solution to my problem on Stackoverflow will cost me 0
System.out.println(
replace("Solution to my problem on stackoverflow will cost me $0.",
".$"));
}
static String replace(String line, String charsToBeReplaced) {
Pattern p = Pattern.compile("(.{1})");
Matcher m = p.matcher(charsToBeReplaced);
return line.replaceAll(m.replaceAll("\\\\$1\\|"), "");
}
}
在输入替换方法中处理特殊的正则表达式字符(元字符)首先在每个字符和|之前放置\(反斜杠) (管道)输入中的每个字符后面。因此,",."
的输入将变为"\\,|\\.|"
一旦完成,那么替换非常简单:对于每个匹配的char,将其替换为空白。
此解决方案中未使用,但此处是检测Java中 ANY 特殊正则表达式字符的存在的模式:
Pattern metachars = Pattern.compile(
"^.*?(\\(|\\[|\\{|\\^|\\-|\\$|\\||\\]|\\}|\\)|\\?|\\*|\\+|\\.).*?$");
答案 6 :(得分:1)
Guava方法很有意思,但我不确定为什么他们使用“spread”变量。由于它们使用它,因此每个班次都需要减法操作。我对几个版本(包括一个简单的手动编码移位器)进行了基准测试,你可以在这里找到这篇文章:
http://thushw.blogspot.com/2013/06/java-remove-specified-characters-from.html
答案 7 :(得分:0)