要检查字符串是否包含特定字符,您可以使用indexOf
方法。
"Blah blah.".indexOf("."); //Returns number
我有一个字符串,除了字母和数字之外不应该包含任何内容。我可以通过正则表达式检查:
[^a-zA-Z0-9]
or just
[a-z\d] /i
但在这种特殊情况下,不欢迎正则表达式。在像C(或C ++)这样的语言中,我会循环使用字符串。据我所知,在Java中[]
运算符不是字符串的选项。
是否有比regexp更快的选项?
答案 0 :(得分:3)
您可以使用String.indexOf:
boolean isLetterOrDigit(String s) {
final String UPPERCASE_LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
final String LOWERCASE_LETTERS = "abcdefghijklmnopqrstuvwxyz";
final String NUMBERS = "1234567890";
final String ALLOWED = UPPERCASE_LETTERS
+ LOWERCASE_LETTERS + NUMBERS;
for (char ch : s.toCharArray()) {
if (ALLOWED.indexOf(ch) == -1) {
return false;
}
}
return true;
}
答案 1 :(得分:1)
如果您在紧密的内循环中进行大量验证并且性能是一个问题,一个常见的模式是保留预编译的正则表达式,例如:作为一个静态常量,以避免为每次验证重新编译相同的正则表达式的开销(如String
提供的便捷方法中所做的那样):
import java.util.regex.Pattern;
public class StringValidate {
private static final Pattern VALID_STR = Pattern.compile("(?i)[a-z0-9]+");
public static boolean isValidStr(String s) {
return VALID_STR.matcher(s).matches();
}
public static void main(String[] args) {
System.out.println(isValidStr("abc12d")); // true
System.out.println(isValidStr("xyz ")); // false
}
}
这里的优势在于,只需修改正则表达式,您就可以轻松调整验证规则,只需最少的代码更改。
答案 2 :(得分:0)
你可以通过matches()
方法使用正则表达式进行测试:
if (!str.matches("[a-zA-Z0-9]+")) {
// str contains an unwanted char
在java中的FYI,正则表达式标志在正则表达式本身中编码,因此要实现不区分大小写的示例:
if (!str.matches("(?i)[a-z0-9]+"))
另请注意,\d
不等同于[0-9]
,因为它包含所有数字字符(例如阿拉伯语,中文等)。
答案 3 :(得分:0)
如果我理解正确的话。有一个名为String.contains(CharSequence s)
的方法可以找到字符串中的任何子序列。希望能帮助到你。