Java replaceAll似乎不适用于正则表达式

Java replaceAll似乎不适用于正则表达式,java,regex,regex-negation,Java,Regex,Regex Negation,我想替换字符串中所有非字母数字或不属于用户输入的特殊字符列表的字符 String pagePath = "/content/geo/en/tool"; String specialCharacters = "\\:*?\"<>|#"; String fileName = pagePath.replaceAll("[^\\p{IsAlphabetic}^\\p{IsDigit}\\:*?\"<>|#]", replacer); //This works fine o/p:

我想替换字符串中所有非字母数字或不属于用户输入的特殊字符列表的字符

String pagePath = "/content/geo/en/tool";
String specialCharacters = "\\:*?\"<>|#";
String fileName = pagePath.replaceAll("[^\\p{IsAlphabetic}^\\p{IsDigit}\\:*?\"<>|#]", replacer); //This works fine o/p: ~content~geo~en~tool

String test2 = "\"[^\\p{IsAlphabetic}^\\p{IsDigit}" + specialCharacters + "]\"";
String fileName2 = pagePath.replaceAll(test2, replacer);
String pagePath=“/content/geo/en/tool”;
字符串特殊字符=“\\:*?\”|#“;
字符串fileName=pagePath.replaceAll(“[^\\p{IsAlphabetic}^\\p{IsDigit}\\:*?\”|#]],replacer)//这适用于良好的o/p:~content~geo~en~工具
字符串test2=“\”[^\\p{IsAlphabetic}^\\p{IsDigit}”+特殊字符+“]\”;
字符串fileName2=pagePath.replaceAll(test2,replacer);
出于某种原因,fileName2的值保持为/content/geo/en/tool


有人能帮我解决什么问题吗

无需在
test2
中转义引号:

String test2 = "[^\\p{IsAlphabetic}^\\p{IsDigit}" + specialCharacters + "]";

测试2
的开始和结束处有额外的
(可能由IDE自动转义)。若要了解两个正则表达式工作不一致的原因,请尝试打印它们,以便比较它们的内容。投票以复制粘贴类型关闭。顺便说一句
^
仅在字符类的开始处表示否定
[^]如果你把它放在中间,它将被视为简单的文字。BTW2<代码> \>代码>甚至在字符类<代码>…
是元字符,所以
\\:
表示转义
。我不确定您的意图是什么,但是
不是元字符,所以它不需要转义,所以如果这是您试图实现的,那么
\
是多余的(这使您的正则表达式比它应该的更混乱)。如果这不是您的目标,那么您应该允许正则表达式通过
模式转义所有这些字符。quote(specialCharacters)
\\was是为了转义\。我将按照您的建议使用Pattern.quote。谢谢。由排印错误引起的问题(如错误的复制粘贴区域)除了OP之外,其他人都无法得到帮助,这意味着他们在堆栈溢出问题上偏离了主题。我知道这看起来很容易获得声誉积分,但在某些情况下,这样的问题很有可能会被删除,并在其上赢得声誉,这可能会给你留下负平衡。在某一天。因此,不要将解决方案作为答案发布,请随时向post是允许OP删除它的评论(只要没有经过投票/接受的答案)。好的。老实说,我一开始并没有把它看作是一个打字错误。我怀疑OP会故意把它放在那里。但是许多IDE在粘贴字符串时会自动转义
,这表明复制粘贴错误,哪一个是印刷错误的例子。