我为此创建了这个正则表达式:
(?<!\w)name(?!\w)
我希望它符合以下内容:
name
(name)
但不应该匹配以下内容:
myname
names
我的问题是,如果我在Java中使用这种模式,它就不适用于使用与空格不同的其他符号的情况,如括号。
我测试了这个网站中的正则表达式(http://gskinner.com/RegExr/,这是一个非常好的网站btw)并且它有效,所以我想知道Java是否需要不同的语法。
String regex = "((?<!\\w)name(?!\\w))";
"(name".matches(regex); //it returns false
答案 0 :(得分:4)
为什么不使用单词边界?
Pattern pattern = Pattern.compile("\\bname\\b");
String test = "name (name) mynames";
Matcher matcher = pattern.matcher(test);
while (matcher.find()) {
System.out.println(matcher.group() + " found between indexes: " + matcher.start() + " and " + matcher.end());
}
输出:
name found between indexes: 0 and 4
name found between indexes: 6 and 10
答案 1 :(得分:3)
使用“单词边界”正则表达式\b
:
if (str.matches(".*\\bname\\b.*")
// str contains "name" as a separate word
请注意,这将不匹配“foo _name bar”或“foo name1 bar”,因为下划线和数字被视为单词字符。如果您想匹配“名称”周围的“非字母”,请使用:
if (str.matches(".*(^|[^a-zA-Z])name([^a-zA-Z]|$).*")
// str contains "name" as a separate word