【问题标题】:Android Java - String .replaceAll to replace specific characters (regex)Android Java - String .replaceAll 替换特定字符(正则表达式)
【发布时间】:2016-07-06 20:40:33
【问题描述】:

如果它们出现,我需要删除一些特定的“特殊”字符并用空字符串替换它们。 我目前遇到了正则表达式的问题,可能是 Java 转义。我无法将它们全部放在一起,它只是不起作用,我尝试了很多! T_T

目前我正在一个一个地做这有点傻,但现在至少它可以工作,就像这样:

public static String filterSpecialCharacters(String string) {
    string = string.replaceAll("-", "");
    string = string.replaceAll("\\[", "");
    string = string.replaceAll("\\]", "");
    string = string.replaceAll("\\^", "");
    string = string.replaceAll("/", "");
    string = string.replaceAll(",", "");
    string = string.replaceAll("'", "");
    string = string.replaceAll("\\*", "");
    string = string.replaceAll(":", "");
    string = string.replaceAll("\\.", "");
    string = string.replaceAll("!", "");
    string = string.replaceAll(">", "");
    string = string.replaceAll("<", "");
    string = string.replaceAll("~", "");
    string = string.replaceAll("@", "");
    string = string.replaceAll("#", "");
    string = string.replaceAll("$", "");
    string = string.replaceAll("%", "");
    string = string.replaceAll("\\+", "");
    string = string.replaceAll("=", "");
    string = string.replaceAll("\\?", "");
    string = string.replaceAll("|", "");
    string = string.replaceAll("\"", "");
    string = string.replaceAll("\\\\", "");
    string = string.replaceAll("\\)", "");
    string = string.replaceAll("\\(", "");
    return string;
}

这些都是我需要删除的字符:

- [ ] ^ / , ' * : . ! > < ~ @ # $ % + = ? | " \ ) (

我显然遗漏了一些东西,我不知道如何将它们全部放在一行中。帮忙?

【问题讨论】:

  • 放入一个字符类:[&lt;&gt;!~@^()....]
  • 看起来很像string = string.replaceAll("\\p{Punct}+", "")。见Java regex reference\p{Punct} 标点:!"#$%&amp;'()*+,-./:;&lt;=&gt;?@[]^_`{|}~之一。但是,我发现您的类中定义的符号要少一些。

标签: java android regex


【解决方案1】:

您的代码实际上不起作用,因为.replaceAll("$", "") 用空字符串替换了字符串的结尾。要替换文字 $,您需要对其进行转义。删除管道符号也是同样的问题。

您需要做的就是将需要替换的字符放入一个字符类中并应用+ 量词以获得更好的性能,如下所示:

string = string.replaceAll("[-\\[\\]^/,'*:.!><~@#$%+=?|\"\\\\()]+", "");

请注意,在字符类中,大多数“特殊正则表达式元字符”会失去其特殊状态,您只需转义 []\、一个连字符(如果它不在开头/结尾处)字符类的)和一个^(如果它是“正”字符类中的第一个符号)。

DEMO:

String s = "-[]^/,'*:.!><~@#$%+=?|\"\\()TEXT";
s = s.replaceAll("[-\\[\\]^/,'*:.!><~@#$%+=?|\"\\\\()]+", "");
System.out.println(s); // => TEXT

【讨论】:

  • 管道 (|) 也需要在他的原始代码中转义(但不是在你的代码中)。
  • 是的,在答案中添加了一个注释。
  • 我的意思是说他应该逃脱它,但没有。
  • 看起来很像string = string.replaceAll("\\p{Punct}+", "")。见Java regex reference\p{Punct} 标点:!"#$%&amp;'()*+,-./:;&lt;=&gt;?@[]^_`{|}~之一。但是,我发现您的类中定义的符号要少一些。
【解决方案2】:

使用这些代码

String REGEX = "YOUR_REGEX";
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(yourString);
yourString = m.replaceAll("");

更新:

你的正则表达式看起来像

String REGEX = "-|\\[|\\]|\\^|\\/|,|'|\\*|\\:|\\.|!|>|<|\\~|@|#|\\$|%|\\+|=\\?|\\||\\\\|\\\\\\\\|\\)|\\(";

SAPMLE:

String yourString = "#My (name) -is @someth\ing"";
//Use Above codes
Log.d("yourString",yourString);

输出

【讨论】:

  • 这如何回答这个问题?
  • 首先感谢您抽出宝贵时间帮助我。非常感谢!第二,-> String REGEX = "\"[^/,'*:!~@#$%^&()+=?()\\\"|!\[#$-]+\"" ; Pattern p = Pattern.compile(REGEX); Matcher m = p.matcher(string); string = m.replaceAll(""); - 这不起作用。
  • 你能发布你当前的字符串吗?
  • 您确定您使用的是有效的正则表达式吗?
  • @ShreeKrishna 我确实发现这很有帮助!这当然是实现我预期目标的另一种好方法,非常感谢您花时间提供答案!非常感谢。
猜你喜欢
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
相关资源
最近更新 更多