2017-09-21 167 views
1

我在Oracle的纪录片中读到\z表示输入结束。但编辑器会抛出错误。 当java是最后一个单词时,我需要在文本中找到单词“java”。任何消化如何处理?为什么 z正则表达式对我不起作用?

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

这是一个边界匹配器。你不能在角色类中使用它。你的意思是(\\ W | \\ z)'? –

+0

零宽度断言不保留它们在字符类中的含义。使用'(?:\\ W | \\ z)',或者只是'(?!\\ w)'。您似乎希望将某个单词作为整个单词进行匹配,请检查单纯的“\ b”单词边界是否适合您。如果'language'可能以非单词字符开始/结束,那么'\ b'将不起作用。你可以使用'“(?<!\\ w)”+ Pattern.quote(language)+“(?!\\ w)”'。 –

+0

'[..]'表示字符类(单个指定范围)。 '\ z'不代表字符,而是* place *,就像'\ b'一样,它也不是字符类的有效元素。顺便说一句''''在'[..]'中是简单的字符,而不是OR运算符。 – Pshemo

回答

2

[...]定义字符类,你可以在里面定义字符\z是一个锚点,一个零宽度断言。所有零宽度断言 - \A,\b,\G,^,$ - 在放入字符类时不保留其“特殊”含义。

你得到的错误是由于the fact that

它是用之前的任何字母字符不表示一个转义构建一个反斜杠的错误;这些保留用于未来对正则表达式语言的扩展。

您似乎想要匹配一个单词,其中有一个空格或字符串的开始之前或非字,数字或字符串结尾之后。我建议使用

Pattern p = Pattern.compile("(?<!\\S)" + Pattern.quote(language) + "(?![^\\W\\d])"); 

(?<!\\S)是负回顾后,只有匹配立即前面有一个空格或字符串的开始位置。 (?![^\\W\\d])是一个否定的前瞻,如果下一个字符不是非单词字符或不是数字(因此可能有数字,非单词或字符串结尾),则匹配失败。

查看regex demo

+0

负面看起来很神秘,但它们比变化更有效率,特别是在Java正则表达式中。进一步澄清:'(?<!\ S)'='(?<= \ s | ^)','[^ \ W \ d]'= *任何字母或'_' *,'[\ w && [^ \ d]]'和'(?![^ \ W \ d])'='(?= \ W | \ d | $)' –

相关问题