アラン:
私は修正していcharset
以下のいずれかになります。
首都と小文字:
A - Z、aからz
数字:
0-9
特殊文字:
N、E、N、A、@、£、$、¥、および、E、U、I、O、_、!、」、#、%、&、」、(、)、*、+、,, 。? - 、/、:、;、<、=、>、、§、」、SPACE、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, €, [, ], {, |, }, ^, ~, , ß\"");
だから、基本的に私が上書かれている全体の文字セット。それはのように一致しませんでしたASCII
私predifined以外の文字があるかどうかを確認するために任意の高速かつ信頼性の高いスケーラブルな方法はありますか?
レオ阿蘇:
文字が存在するO(1)時間で発生しているかどうかをチェック - 私が最も効率的な方法の一つは、BitSetのだろうと考えています。それは大体アレイを使用して同じくらい効率的であるが、唯一の一から八スペースの約必要があります。
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;
}
}
次に、あなたが書くことができます
if (MyCustomMatcher.matchesAll("Hello world")) {
// do something
}
私は簡単にするために、クラスの静的を作っていますが、コンストラクタで一致する文字を渡すことによって、それはより柔軟で再利用可能にすることができます。