繁体   English   中英

如何使用正则表达式过滤不需要的字符的字符串?

[英]How to filter string for unwanted characters using regex?

基本上,我想知道是否有一个方便的 class 或过滤字符串中不需要的字符的方法。 该方法的 output 应该是 'cleaned' 字符串。 IE:

String dirtyString = "This contains spaces which are not allowed"

String result = cleaner.getCleanedString(dirtyString);

预期结果将是:

"Thiscontainsspaceswhicharenotallowed"

一个更好的例子:

String reallyDirty = " this*is#a*&very_dirty&String"

String result = cleaner.getCleanedString(dirtyString);

我希望结果是:

"thisisaverydirtyString"

因为,我让清洁工知道 ' '、'*'、'#'、'&' 和 '_' 是脏字符。 我可以通过使用白/黑列表字符数组来解决它。 但我不想重新发明轮子。

我想知道是否已经存在可以使用正则表达式“清理”字符串的东西。 而不是自己写这个。

补充:如果您认为清理字符串可以做得不同/更好,那么我当然也会全神贯注

另一个补充: - 它不仅适用于空格,还适用于任何类型的字符。

根据您的更新编辑:

dirtyString.replaceAll("[^a-zA-Z0-9]","")

如果你在你的项目中使用guava (如果你不是,我相信你应该考虑它), CharMatcher类非常好地处理它:

你的第一个例子可能是:

result = CharMatcher.WHITESPACE.removeFrom(dirtyString);

而你的第二个可能是:

result = CharMatcher.anyOf(" *#&").removeFrom(dirtyString);
// or alternatively
result = CharMatcher.noneOf(" *#&").retainFrom(dirtyString);

或者如果你想更灵活地使用空格(制表符等),你可以将它们组合起来而不是编写自己的:

CharMatcher illegal = CharMatcher.WHITESPACE.or(CharMatcher.anyOf("*#&"));
result = illegal.removeFrom(dirtyString);

或者您可以改为指定合法字符,这取决于您的要求可能是:

CharMatcher legal = CharMatcher.JAVA_LETTER; // based on Unicode char class
CharMatcher legal = CharMatcher.ASCII.and(CharMatcher.JAVA_LETTER); // only letters which are also ASCII, as your examples
CharMatcher legal = CharMatcher.inRange('a', 'z'); // lowercase only
CharMatcher legal = CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z')); // either case

其次是retainFrom(dirtyString) ,如上所示。

非常好,功能强大的API。

使用replaceAll

这样做:

String dirtyString = "This contains spaces which are not allowed";
String result = dirtyString.replaceAll("\\s", "");

并通过用'nothing'替换所有空格来工作。

String resultString = subjectString.replaceAll("\\P{L}+", "");

将用任何东西替换任何非字母字符。

我也更喜欢白名单方法。 你永远不会知道到底是什么。 似乎比字符更多的编码。 这样你可以控制它:

public String convert(String s) {
  s = StringUtils.removePattern(s, "[^A-Za-zäöüÄÖÜß?!$,. 0-9\\-\\+\\*\\?=&%\\$§\"\\!\\^#:;,_²³°\\[\\]\\{\\}<>\\|~]'`'");
  return s.trim();
}

这包含所有德国变音符号和法语口音......你知道 - 只需看看你的键盘。 我想我已经把它们都拿走了。 随意省略像<>这样的特殊字符以防止代码注入......

过滤代码点

正则表达式不是实现目标的唯一途径。 您可以获取字符串中每个字符的代码点integer 编号,然后过滤掉Unicode中不被视为字母的那些。

String#codePoints方法返回一个IntStream ,一个 stream 的int原始值,每个字符一个。

Character class 可以告诉我们分配给 Unicode 中每个代码点编号的字符是否被视为字母,而不是空格、数字、标点符号等。

通过我们测试的那些代码点通过StringBuilder class 转换回String

String input = " this*is#a*&very_dirty&String" ; 
String onlyLetters = 
        input 
        .codePoints()
        .filter(
            codePoint -> Character.isLetter( codePoint ) 
        )
        .collect(               
            StringBuilder :: new ,        
            StringBuilder :: appendCodePoint , 
            StringBuilder :: append    
        )        
        .toString() 
;

请参阅在 Ideone.com 上实时运行的代码

这是非常脏的字符串

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM