检查字符串是否包含与Java中给定字符不同的字符
我有一个fix检查字符串是否包含与Java中给定字符不同的字符,java,ascii,guava,Java,Ascii,Guava,我有一个fix字符集,如下所示: 大写和小写: A-Z,A-Z 数字: 0-9 特殊字符: ñ,É,ñ,á,英镑,美元,日元,è,è,è,è!,“,#,%,,&,,(,),*,+,,-,,/,:,;,?,§,`,空格,CR,LF,€,[,],{,,,,,},^ 我尝试使用库Guava,但我的字符串被匹配为非ASCII唯一字符串: if(!CharMatcher.ascii().matchesAllOf(myString)){ //String doesn't match
字符集
,如下所示:
大写和小写:
A-Z,A-Z
数字:
0-9
特殊字符:
ñ,É,ñ,á,英镑,美元,日元,è,è,è,è!,“,#,%,,&,,(,),*,+,,-,,/,:,;,?,§,`,空格,CR,LF,€,[,],{,,,,,},^
我尝试使用库Guava
,但我的字符串被匹配为非ASCII唯一字符串:
if(!CharMatcher.ascii().matchesAllOf(myString)){
//String doesn't match
}
我的输入字符串是:
smsBodyBlock.setBodyContent("A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, Ä, Ö, Ü,a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, ä, ö, ü,0, 1, 2, 3, 4, 5, 6, 7, 8, 9,Ñ, É, ñ, à, @, £, $, ¥, è, é, ù, ì, ò, _, !, , #, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, §, `, SPACE, CR, LF, €, [, ], {, |, }, ^, ~, , ß\"");
“A、B、C、C、D、E、F、F、G、H、I、J、K、L、M、N、O、P、P、P、R、S、T、T、T、T、T、U、V、V、W、W、S、T、T、T、U、V、W、W、S、S、T、T、T、U、W、W、W、X、X、Y、Y、T、T、T、T、T、T、U、V、W、W、W、W、X、X、X、Y、Y、Y、Y、Y、Y、Y、Y、Y、Z、Z、Z、C、Z、Z、Z、A、和(1965、B、B、B、B、B、B、C、B、B、B、B、D、E、E、B、E、E、E、E、C、E、E、E、E、E、E、E、E、E、E、E、E、Eò,ò,ò,!,#,%,&,,(,),*,+,,-,,,/,:,;,?,§,`,空格,CR,LF,€,[,],{,|,},^,~,ß\'';
基本上就是我上面写的整个字符集。它与ASCII不匹配
有没有什么快速可靠的可伸缩方法来检查除了我预先定义的字符之外是否还有其他字符?我相信最有效的方法之一是位集-检查字符是否在O(1)时间内出现。它的效率大致相当于使用数组,但只需要大约八分之一的空间
static class MyCustomMatcher {
// bits needed = last character + 1
private static final BitSet matcher = new BitSet('ü' + 1);
static {
String other = " \r\nÑÉñà@£$¥èéùìò_!\"#%&',()*+-./:;<=>?§`€[]{|}^~\ßÄÖÜäöü";
matcher.set(c, 'A', 'Z' + 1); // upper
matcher.set(c, 'a', 'z' + 1); // lower
matcher.set(c, '0', '9' + 1); // digit
for (int i = 0; i < other.length(); i++) matcher.set(other.charAt(i));
}
public static boolean matchesAll(String s) {
for (int i = 0; i < s.length(); i++) {
if (!matcher.get(s.charAt(i))) return false;
}
return true;
}
}
为了简单起见,我将该类设为静态类,但通过在构造函数中传递要匹配的字符,可以使其更加灵活和可重用。我认为最有效的方法之一是位集检查字符是否在O(1)时间内出现。它的效率大致相当于使用数组,但只需要大约八分之一的空间
static class MyCustomMatcher {
// bits needed = last character + 1
private static final BitSet matcher = new BitSet('ü' + 1);
static {
String other = " \r\nÑÉñà@£$¥èéùìò_!\"#%&',()*+-./:;<=>?§`€[]{|}^~\ßÄÖÜäöü";
matcher.set(c, 'A', 'Z' + 1); // upper
matcher.set(c, 'a', 'z' + 1); // lower
matcher.set(c, '0', '9' + 1); // digit
for (int i = 0; i < other.length(); i++) matcher.set(other.charAt(i));
}
public static boolean matchesAll(String s) {
for (int i = 0; i < s.length(); i++) {
if (!matcher.get(s.charAt(i))) return false;
}
return true;
}
}
为了简单起见,我将该类设为静态类,但您可以通过在构造函数中传递要匹配的字符使其更灵活和可重用。这正是
CharMatcher
存在的原因,您已经在使用它,只是没有完全扩展它
唯一的区别是您应该定义自己的角色集
那么,让我们开始:
CharMatcher letters = CharMatcher.inRange('a', 'z')
.or(CharMatcher.inRange('A', 'Z'));
CharMatcher numbers = CharMatcher.inRange('0, '9');
CharMatcher specials = CharMatcher.anyOf("ÑÉñà@£$¥èéùìò_!\"#%&'()*+,-./:;<=>?§` \r\n€[]{|}^~\\ßÄÖÜäöü");
CharMatcher allMyCharacters = letters.or(numbers).or(specials);
// If you want performance, keep the line below. If not, remove it
allMyCharacters = allMyCharacters.precomputed();
if (allMyCharacters.matchesAllOf(myString)) {
//
}
这正是
CharMatcher
存在的原因,而您已经在使用它,只是没有完全扩展它
唯一的区别是您应该定义自己的角色集
那么,让我们开始:
CharMatcher letters = CharMatcher.inRange('a', 'z')
.or(CharMatcher.inRange('A', 'Z'));
CharMatcher numbers = CharMatcher.inRange('0, '9');
CharMatcher specials = CharMatcher.anyOf("ÑÉñà@£$¥èéùìò_!\"#%&'()*+,-./:;<=>?§` \r\n€[]{|}^~\\ßÄÖÜäöü");
CharMatcher allMyCharacters = letters.or(numbers).or(specials);
// If you want performance, keep the line below. If not, remove it
allMyCharacters = allMyCharacters.precomputed();
if (allMyCharacters.matchesAllOf(myString)) {
//
}
您可以简单地遍历字符串的每个字符以查找错误character@ILikeSahne这将是非常低效的,或者?它不会变得更好。库正在使用simular解决方案您可以有一个大小为256的布尔数组,用于告诉任何与拉丁语1兼容的unicode字符它是否是可接受的字符。这将是非常快的,只消耗256布尔内存。除此之外,您还添加了一个条件,即欧元符号也被接受。您能解释一下布尔数组的含义吗taht告诉…*您可以简单地遍历字符串的每个字符以查找错误的字符character@ILikeSahne这将是非常低效的,或者?它不会变得更好。库正在使用simular解决方案您可以有一个大小为256的布尔数组,用于告诉任何与拉丁语1兼容的unicode字符它是否是可接受的字符。这将是非常快的,只消耗256布尔内存。除此之外,您还添加了一个条件,即欧元符号也被接受。您能解释一下布尔数组的意思吗taht告诉…*看起来很快,但我想知道为什么在第二个foor循环中有一个
a
,打字错误?利奥,你能解释一下为什么在位集中插入'ü'+1
构造函数吗?+你忘了逗号too@Alan位集所需的最小位数等于添加到位集的最大值+1。如果未指定所需的大小,则位集将自行猜测大小,这可能导致具有未使用空间的超大位集,或需要重复扩展的小位集。但是,在这种情况下,由于您需要存储的最高字符是'ü'
,您可以告诉位集精确分配'ü'+1
位。看起来相当快,但我想知道为什么在第二个foor循环中有a
,打字错误?利奥,你能解释一下为什么在位集中插入'ü'+1
构造函数吗?+你忘了逗号too@Alan位集所需的最小位数等于添加到位集的最大值+1。如果未指定所需的大小,则位集将自行猜测大小,这可能导致具有未使用空间的超大位集,或需要重复扩展的小位集。但是,在这种情况下,由于需要存储的最高字符是“ü”
,因此您可以告诉位集精确分配“ü”+1
位。这需要一个库——但OP已经在使用该库了。Guava实现与使用位集的自定义解决方案几乎相同。如果我的项目中已经有番石榴,我会这样做;否则我会使用位集实现。很好。这需要一个库——但OP已经在使用该库了。Guava实现与使用位集的自定义解决方案几乎相同。如果我的项目中已经有番石榴,我会这样做;否则,我将使用位集实现。