【问题标题】:Java String Filter out unwanted charactersJava String 过滤掉不需要的字符
【发布时间】:2017-10-27 00:51:22
【问题描述】:

我有这样的字符串:

−+-~*/@$^#¨%={}[häagen-dazs;:] a (le & co') jsou "výborné" <značky>?!.

我想结束这个:

häagen-dazs a le & co jsou výborné značky.

How to filter string for unwanted characters using regex? 相比,我想在字符串中保留重音(变音符号)。

我使用以下 replaceAll:

str.replaceAll("[¨%=;\\:\\(\\)\\$\\[\\]\\{\\}\\<\\>\\+\\*\\−\\@\\#\\~\\?\\!\\^\\'\\\"\\|\\/]", "");
  • 这是正确的方法吗?
  • 有没有更简单的方法可以只保留字母数字字符(以及带重音符号)、空格和 & 。 - 符号?

【问题讨论】:

  • @Tushar 该正则表达式会删除变音字母。
  • 试试replaceAll("(?U)[^\\p{L}\\p{N}\\s&amp;.-]", "") 
  • 这是一个demo 使用 Wiktor 的评论。
  • 使用CharMatcher.javaLetterOrDigit().or(CharMatcher.anyOf(" &amp;-.")).retainFrom(yourInput) 你最终会得到-häagen-dazs a le &amp; co jsou výborné značky.CharMatcher 来自番石榴,NB:& 之前有一个空格)
  • @Michal:但是将每个字符与正则表达式匹配是过分的。如果该解决方案有效,您真的只需要s.replaceAll("[^a-zA-Z&amp; _.ýčéèêàâùû-]", "")。大写的ýčéèêàâùû呢?我认为你不应该接受这个答案,我会发布我的。

标签: java regex string char special-characters


【解决方案1】:

您可以遍历所有输入的 String 字符并测试每个字符,如果它与您想要的正则表达式匹配,请保留它,使用此正则表达式 [a-zA-Z&amp; \\-_\\.ýčéèêàâùû] 单独测试每个字符。

这是您需要的代码:

    String input = "−+-~*/@$^#¨%={}[häagen-dazs;:] a (le & co') jsou výborné <značky>?!";
    StringBuffer sb =  new StringBuffer();
    for(char c : input.toCharArray()){
       if((Character.toString(c).toLowerCase()).matches("[a-zA-Z& \\-_\\.ýčéèêàâùû]")){
           sb.append(c);
       }
    }
    System.out.println(sb.toString()); 

演示:

这里是a working Demo,它使用此代码并提供以下输出:

-hagen-dazs. a le & co jsou výborné značky

注意:

  • 它使用input.toCharArray() 获取chars 的数组并循环遍历它。
  • 它使用(Character.toString(c).toLowerCase()).matches("[a-zA-Z&amp; \\-_\\.ýčéèêàâùû]") 来测试迭代的char 是否与允许的字符Regex 匹配。
  • 它使用StringBuffer 构造一个新的String,只有 允许的字符。

【讨论】:

  • 这对我来说是最好的解决方案。对于想要支持完整的捷克语/斯洛伐克语/德语的其他任何人,请使用:(Character.toString(c).toLowerCase()).matches("[a-z& \\-_\\.äáàâčďéèêěíľňóööřšťùûúůüýž]")跨度>
【解决方案2】:

你需要使用

String res = input.replaceAll("(?U)[^\\p{L}\\p{N}\\s&.-]+", "");

请注意,正则表达式匹配除(因为[^...] 是否定字符类)之外的任何字符一次或多次(由于+ 量词):

  • \p{L} - 任何 Unicode 字母
  • \p{N} - 任何 Unicode 数字
  • \s - 任何 Unicode 空白(\s 由于 (?U) 内联 Pattern.UNICODE_CHARACTER_CLASS 修饰符版本而可识别 Unicode)
  • &amp; - 文字 &amp;
  • . - 文字 .
  • - - 文字连字符(因为它位于字符类的末尾

Java demo:

import java.util.*;
import java.lang.*;

class Rextester
{  
    public static void main(String args[])
    {
        String input = "−+-~*/@$^#¨%={}[häagen-dazs;:] a (le & co') jsou výborné <značky>?!";
        input = input.replaceAll("(?U)[^\\p{L}\\p{N}\\s&.-]+", "");
        System.out.println(input);
    }
}

输出:-häagen-dazs a le &amp; co jsou výborné značky

【讨论】:

    【解决方案3】:

    试试这个

    str.replaceAll("[\\\/\.\:\%\!\[\]\(\)\{\}\?\^\*\+\"\'#@$;¨=&<>-~−]", "");
    

    你的正则表达式的sintax有问题,我建议你一步一步构建你的正则表达式,以便立即找出是否有错误。

    尝试使用本站实时测试正则表达式,非常好

    https://regex101.com/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      • 2016-05-10
      • 1970-01-01
      相关资源
      最近更新 更多