这是我的代码,用于确定单词是否包含任何非字母数字字符:
String term = "Hello-World";
boolean found = false;
Pattern p = Pattern.Compile("\\W*");
Matcher m = p.Matcher(term);
if(matcher.find())
found = true;
我想知道正则表达式是否错误。我知道"\W"
会匹配任何非单词字符。关于我错过的任何想法?
答案 0 :(得分:16)
将正则表达式更改为:
.*\\W+.*
答案 1 :(得分:4)
这是您正在寻找的表达:
“^ [A-ZA-Z0-9] + $”
当评估为false时,意味着不匹配,这意味着你找到了你想要的东西。
答案 2 :(得分:4)
It's 2016 or later and you should think about international strings from other alphabets than just Latin. The frequently cited [^a-zA-Z]
will not match in that case. There are better ways in Java now:
[^\\p{IsAlphabetic}^\\p{IsDigit}]
See the reference (section "Classes for Unicode scripts, blocks, categories and binary properties"). There's also this answer that I found helpful.
答案 3 :(得分:3)
方法是错误的。
匹配器被声明为m但用作匹配器。
重复应为“一个或多个”+而不是“零或多个”* 这可以正常工作:
String term = "Hello-World";
boolean found = false;
Pattern p = Pattern.compile("\\W+");//<-- compile( not Compile(
Matcher m = p.matcher(term); //<-- matcher( not Matcher
if(m.find()) { //<-- m not matcher
found = true;
}
不过,如果你只是这样就足够了:
boolean found = m.find();
:)
答案 4 :(得分:2)
问题是'*'
。 '*'
匹配ZERO或更多字符。您希望匹配至少一个非单词字符,因此必须使用'+'
作为数量修饰符。因此匹配\W+
(大写字母W为NON字)
答案 5 :(得分:1)
您的表达不考虑可能的非英文字母。它也比它需要的更复杂。除非你出于某种原因使用正则表达式(例如你的教授告诉过你),否则你的状况要好得多:
boolean found = false;
for (int i=0;i<mystring.length();++i) {
if (!Character.isLetterOrDigit(mystring.charAt(i))) {
found=true;
break;
}
}
答案 6 :(得分:0)
当我不得不做同样的事情时,我使用的正则表达式是“(\ w)*”这就是我使用的东西。不确定国会大厦是否相同,但我也使用括号。
答案 7 :(得分:0)
如果可以使用Apache StringUtils,那么就像下面的
一样简单StringUtils.isAlphanumeric(inp)
答案 8 :(得分:-1)
if (value.matches(".*[^a-zA-Z0-9].*")) { // tested, seems to work.
System.out.println("match");
} else {
System.out.println("no match");
}