Java正则表达式:检查单词是否包含非字母数字字符
这是我的代码,用于确定单词是否包含任何非字母数字字符:
String term = "Hello-World"; boolean found = false; Pattern p = Pattern.Compile("\\W*"); Matcher m = p.Matcher(term); if(matcher.find()) found = true;
我想知道正则表达式是否错误。 我知道"\W"
会匹配任何非单词字符。 对我失踪的任何想法?
将你的正则表达式改为:
.*\\W+.*
这是您正在寻找的表达:
“^ [A-ZA-Z0-9] + $”
当它评估为false时意味着不匹配,这意味着你找到了你想要的东西。
它是2016年或更晚,您应该考虑来自其他字母表的国际字符串,而不仅仅是拉丁语。 在这种情况下,经常引用的[^a-zA-Z]
将不匹配。 Java现在有更好的方法:
[^\\p{IsAlphabetic}^\\p{IsDigit}]
请参阅参考资料 (“Unicode脚本,块,类别和二进制属性的类”一节)。 我发现这个答案也很有帮助。
方法是错误的。
匹配器被声明为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();
🙂
问题是'*'
。 '*'
匹配ZERO或更多字符。 您希望匹配至少一个非单词字符,因此必须使用'+'
作为数量修饰符。 因此匹配\W+
(大写W有非单词)
你的表达没有考虑可能的非英文字母。 它也比它需要的更复杂。 除非你出于某种原因使用正则表达式而不是需要(例如你的教授告诉过你),否则你会更好:
boolean found = false; for (int i=0;i
当我不得不做同样的事情时,我使用的正则表达式是“(\ w)*”这就是我使用的东西。 不确定国会大厦是否相同,但我也使用括号。
if (value.matches(".*[^a-zA-Z0-9].*")) { // tested, seems to work. System.out.println("match"); } else { System.out.println("no match"); }