![](/img/trans.png)
[英]How to use Pattern.matches with regex to filter unwanted characters in a string
[英]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()
;
这是非常脏的字符串
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.