【发布时间】:2012-02-27 11:28:38
【问题描述】:
考虑以下代码sn-p:
String input = "Print this";
System.out.println(input.matches("\\bthis\\b"));
输出
false
这种方法可能有什么问题?如果它是错误的,那么找到确切单词匹配的正确解决方案是什么?
PS:我在这里找到了许多类似的问题,但没有一个提供我正在寻找的解决方案。 提前致谢。
【问题讨论】:
考虑以下代码sn-p:
String input = "Print this";
System.out.println(input.matches("\\bthis\\b"));
输出
false
这种方法可能有什么问题?如果它是错误的,那么找到确切单词匹配的正确解决方案是什么?
PS:我在这里找到了许多类似的问题,但没有一个提供我正在寻找的解决方案。 提前致谢。
【问题讨论】:
当您使用matches() 方法时,它会尝试匹配整个输入。在您的示例中,输入 "Print this" 与模式不匹配,因为单词 "Print" 不匹配。
所以你需要在正则表达式中添加一些东西来匹配字符串的初始部分,例如
.*\\bthis\\b
如果你也想在行尾允许额外的文本:
.*\\bthis\\b.*
或者,使用Matcher 对象并使用Matcher.find() 在输入字符串中查找匹配:
Pattern p = Pattern.compile("\\bthis\\b");
Matcher m = p.matcher("Print this");
m.find();
System.out.println(m.group());
输出:
this
如果要在一行中查找多个匹配项,可以反复调用find() 和group() 将它们全部提取出来。
【讨论】:
匹配器的完整示例方法:
public static String REGEX_FIND_WORD="(?i).*?\\b%s\\b.*?";
public static boolean containsWord(String text, String word) {
String regex=String.format(REGEX_FIND_WORD, Pattern.quote(word));
return text.matches(regex);
}
解释:
【讨论】:
.* 已经是任何字符零次或多次,因此您不需要?。
有关详细说明,请参阅:http://www.regular-expressions.info/java.html
myString.matches("regex") 返回 true 或 false,具体取决于 字符串可以完全由正则表达式匹配。这是 重要的是要记住 String.matches() 只有在 可以匹配整个字符串。换句话说:“正则表达式”的应用就像 你用字符串锚的开头和结尾写了“^regex$”。这个 与大多数其他正则表达式库不同,其中“快速匹配 如果正则表达式可以匹配到 细绳。如果 myString 是 abc,则 myString.matches("bc") 返回 false。 bc 与 abc 匹配,但 ^bc$(此处实际使用)不匹配。
这写的是“真”:
String input = "Print this";
System.out.println(input.matches(".*\\bthis\\b"));
【讨论】:
您可以使用组来查找确切的单词。 Regex API 通过括号指定组。例如:
A(B(C))D
该语句由三组组成,从 0 开始索引。
所以如果你需要查找某个特定的词,你可以使用Matcher类中的两种方法如:find()查找正则表达式指定的语句,然后得到一个String由其组号指定的对象:
String statement = "Hello, my beautiful world";
Pattern pattern = Pattern.compile("Hello, my (\\w+).*");
Matcher m = pattern.matcher(statement);
m.find();
System.out.println(m.group(1));
上面的代码结果会“漂亮”
【讨论】:
find() 返回一个布尔值,指示匹配是否成功。您应该永远致电find() 并忽略结果。 matches() 和 lookingAt() 同上。此外,组编号从一开始索引,而不是从零开始。第一个“组”group(0) 是代表整个比赛的人工组。
你的searchString 会是正则表达式吗?如果不是简单地使用String.contains(CharSequence s)
【讨论】:
"this" 传递给contains 方法时,如果输入字符串是不带空格的"isthisnice",它也会返回true。所以你不知道,如果匹配是确切的词。
System.out.println(input.matches(".*\\bthis$"));
也有效。这里 .* 匹配空格之前的任何内容,然后匹配到最后的单词。
【讨论】: