从字符串中删除某些字符
我正在考虑使用String.replaceAll()
来删除我的字符串中的某些字符。 目前还不清楚哪些字符会被删除(即我想删除哪些字符),但我认为任何字符都是有效的(如[a-zA-Z]
和$%!
等等)。
我遇到了http://www.java-tips.org/java-se-tips/java.lang/strip-certain-characters-from-a-string.html但肯定有一种比迭代每个角色更好的方法…
有什么想法吗?
谢谢
例:
只是为了澄清,我会有不同长度的字符串。 我想从中删除字符,确切的在运行时确定,然后返回结果字符串。
采取上面的段落,允许我删除“ ,.
”,我会返回字符串:
只是为了澄清我将有不同长度的字符串我想从中删除要在运行时确定的确切字符并返回结果字符串
顺便说一句,我知道replaceAll()使用正则表达式,所以如果我想删除字符“$,。”,我也需要逃避它们,对吧?
我想,下面的代码可以帮到你。
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);
您可能希望首先指定要保留的字符,尝试以下方法:
"mystring".replaceAll("[^a-zA-Z]", "")
只保留信件。
这是正则表达式可能不是一个好主意的情况之一。 你最终会编写更多特殊代码来解决正则表达式,而不是只采用简单的方法并迭代字符。 您还可能会忽略某些可能在以后出现错误的案例。
如果你担心性能,正则表达式实际上要慢得多。 如果您查看代码或配置文件的使用,regex必须创建一个模式来解析/编译,运行匹配的逻辑,然后应用您的替换。 所有这些都会产生很多对象,如果你经常迭代这些对象会很昂贵。
我会在那个链接上实现你所发现的东西。 您可以节省不必要的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(); }
如果您已经在使用该库,Guava可以使用CharMatcher轻松实现
String charsToRemove = "%^#"; String stringToFilter = "I have 20% of my assets in #2 pencils! :^)"; String filtered = CharMatcher.anyOf(charsToRemove).removeFrom(stringToFilter);
我认为你正在寻找这样的代码来解决你的问题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中任何特殊正则表达式字符的存在的模式:
Pattern metachars = Pattern.compile( "^.*?(\\(|\\[|\\{|\\^|\\-|\\$|\\||\\]|\\}|\\)|\\?|\\*|\\+|\\.).*?$");
Guava方法很有意思,但我不确定为什么他们使用“spread”变量。 由于他们使用它,每个class次需要减法操作。 我对几个版本(包括一个简单的手动编码移位器)进行了基准测试,你可以在这里找到这篇文章:
http://thushw.blogspot.com/2013/06/java-remove-specified-characters-from.html
我认为这可以通过使用正则表达式来完成。
首先,我们知道[a-zA-Z]
和$%!
对字符串中的字符有效。 所以我们使用regx "[^a-zA-Z0-9$%!]"
其他无效字符。 有关JAVA patten的详细信息,请查看http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html 。
接下来,我们可以使用mystring.replaceAll(String regex, String replacement)
PS RefexPlanet在线正则表达式测试页面
我想你链接上的示例代码已经足够好了,你可以添加你选择的其他有效字符。 但您可以使用正则表达式最小化代码。 看看阿卜杜拉的代码,或者查看更多link1 , link2 , link3 。