我在Oracle纪录片中读到\z
表示输入结束。但是编译器会抛出错误。
我需要找一个单词&#34; java&#34;在文本中,当java是最后一个单词时。任何消化如何处理它?</ p>
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Why {
public static void main(String[] args) {
String language = "java";
String text = "I'm fan of java";
Pattern p = Pattern.compile("\\s" + language + "[\\W|\\z]");
Matcher m = p.matcher(text);
System.out.println(m.find()); // <-------------- Exception
}
}
// Exception in thread "main" java.util.regex.PatternSyntaxException:
// Illegal/unsupported escape sequence near index 11 \sjava[\W|\z]
答案 0 :(得分:2)
[...]
定义了一个字符类,您可以在其中定义 chars 。 \z
是一个锚,一个零宽度断言。所有零宽度断言 - \A
,\b
,\G
,^
,$
- 在放入字符类时不会保留其“特殊”含义。
您获得的错误归因于the fact that
在任何不表示转义构造的字母字符之前使用反斜杠是错误的;这些保留用于将来对正则表达式语言的扩展。
您似乎希望匹配之前具有空格或字符串开头的单词或之后的非单词,数字或字符串结尾。我建议使用
Pattern p = Pattern.compile("(?<!\\S)" + Pattern.quote(language) + "(?![^\\W\\d])");
(?<!\\S)
是一个负面的lookbehind,它只匹配一个前面有空格或字符串开头的位置。如果下一个字符不是非字母字符或不是数字({(因此可能有数字,非字或字符串结尾),(?![^\\W\\d])
是一个负面预测,使匹配失败。
请参阅regex demo。