Java 为什么这种模式不匹配?([\\\A\\\\W]its[\\\\W\\\\z])

Java 为什么这种模式不匹配?([\\\A\\\\W]its[\\\\W\\\\z]),java,regex,pattern-matching,Java,Regex,Pattern Matching,我正在尝试使用此模式进行替换,因此我需要匹配此模式: String pattern = "[\\\\A\\\\W]its[\\\\W\\\\z]"; 我解释模式的方式是:要么是字符串的开头,要么是空格或逗号之类的非单词字符,然后是“its”,然后是非单词字符或字符串的结尾 为什么它不匹配这个字符串中的“its” its about time 这应该做什么的想法应该是检测像“its”这样写得不正确的单词,并将它们改成“it's” 还有,为什么我需要这么多转义字符才能让vm接受模式?\\A和\\

我正在尝试使用此模式进行替换,因此我需要匹配此模式:

String pattern = "[\\\\A\\\\W]its[\\\\W\\\\z]";
我解释模式的方式是:要么是字符串的开头,要么是空格或逗号之类的非单词字符,然后是“its”,然后是非单词字符或字符串的结尾

为什么它不匹配这个字符串中的“its”

its about time
这应该做什么的想法应该是检测像“its”这样写得不正确的单词,并将它们改成“it's”


还有,为什么我需要这么多转义字符才能让vm接受模式?

\\A
\\z
是边界匹配。它们不能进入角色类。如果正确使用它们,即使用两个斜杠而不是四个斜杠,正则表达式模式编译器将抛出一个异常,因为
\A
\z
不能进入
[]

对非捕获组使用直接的
|
语法:

String pattern = "(?:\\A|\\W)its(?:\\W|\\z)";

您不需要那么多转义字符:\\A应该可以。非单词字符是\s而不是\W@Absurd-请注意,这是我最初的想法,但我遇到了一个regex编译错误或类似的错误,我在这个答案中发现了这个技巧:@ArturasM不需要手动转义。Try似乎工作得很好,现在我的理解是,非捕获组意味着,你以后不能使用像$1、$2、$3这样的东西获得匹配,对吗?虽然我不知道如何在Java中使用组提取,但只有在Perl中。@ArturasM您在非捕获组上是绝对正确的。您可以通过对象获取捕获组
$n
语法在替换API中起作用,包括
String
replaceAll
。因此,如果我做了“It's about time.”replaceAll(模式,$1),并且以前使用过捕获组而不是非非捕获组,我会得到在“\\A |\\W”中找到的内容,对吗?如果您能证实这一点,我将不胜感激。我还有另一个问题,那就是为什么我们必须使用非捕获群体?如果我们不使用那些“$1”和“$2”……是出于性能原因吗?@ArturasM您的表达式不使用捕获组,因此唯一可替换的组是表示整个匹配的
$0
。是一个带有捕获组的演示(注意“its”周围的圆括号)。默认情况下使用非捕获组是一个好主意,并且仅在需要时使用捕获组。这样,表达式更易于维护,因为如果在中间添加非捕获组,则依赖于多个捕获组的代码不会中断。性能考虑因素太小,可以忽略。