为什么\ z正则表达式对我不起作用?

时间:2017-09-21 19:07:45

标签: java regex

我在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]

1 个答案:

答案 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