Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:我是否有一个有效的正则表达式来消除符号&;重命名文件?_Java_Regex - Fatal编程技术网

Java:我是否有一个有效的正则表达式来消除符号&;重命名文件?

Java:我是否有一个有效的正则表达式来消除符号&;重命名文件?,java,regex,Java,Regex,我有一系列的链接名,我试图从中删除特殊字符。从一个简短的文件浏览中,我最担心的似乎是括号、括号和冒号。在尝试使用转义字符选择:[和()失败后,我决定排除文件名中要保留的所有内容 考虑: String foo = inputFilname ; //SAMPLE DATA: [Phone]_Michigan_billing_(automatic).html String scrubbed foo = foo.replaceAll("[^a-zA-Z-._]","") ; 预期结果:Phone\

我有一系列的链接名,我试图从中删除特殊字符。从一个简短的文件浏览中,我最担心的似乎是括号、括号和冒号。在尝试使用转义字符选择
[
)失败后,我决定排除文件名中要保留的所有内容

考虑:

String foo = inputFilname ;   //SAMPLE DATA: [Phone]_Michigan_billing_(automatic).html
String scrubbed foo = foo.replaceAll("[^a-zA-Z-._]","") ;
预期结果:
Phone\u Michigan\u billing\u automatic.html

我的转义字符regex在我放弃它时已经接近60个字符了。在改变策略之前我保存的最后一个版本是
[:(\\[))(\\())(\\)|(\\])]
,我以为我要的是
转义字符-[()
]


总括排除似乎工作得很好。正则表达式真的那么简单吗?有没有关于这个策略的有效性的信息?我觉得我缺少了一些东西,需要几双眼睛。

在我看来,你在这项工作中使用了错误的工具。这将用另一个字符替换所有出现的字符。这是文档:

public static String replaceChars(String str,
                              String searchChars,
                              String replaceChars)

Replaces multiple characters in a String in one go. This method can also be used to delete characters.

For example:
replaceChars("hello", "ho", "jy") = jelly.

A null string input returns null. An empty ("") string input returns an empty string. A null or empty set of search characters returns the input string.

The length of the search characters should normally equal the length of the replace characters. If the search characters is longer, then the extra search characters are deleted. If the search characters is shorter, then the extra replace characters are ignored.

 StringUtils.replaceChars(null, *, *)           = null
 StringUtils.replaceChars("", *, *)             = ""
 StringUtils.replaceChars("abc", null, *)       = "abc"
 StringUtils.replaceChars("abc", "", *)         = "abc"
 StringUtils.replaceChars("abc", "b", null)     = "ac"
 StringUtils.replaceChars("abc", "b", "")       = "ac"
 StringUtils.replaceChars("abcba", "bc", "yz")  = "ayzya"
 StringUtils.replaceChars("abcba", "bc", "y")   = "ayya"
 StringUtils.replaceChars("abcba", "bc", "yzx") = "ayzya"
在你的例子中:

    String translated = StringUtils.replaceChars("[Phone]_Michigan_billing_(automatic).html", "[]():", null);
    System.out.println(translated);
将输出:

电话\密歇根\账单\自动.html


这将比您可以编写的任何正则表达式更简单明了。

我认为您的正则表达式可以像
\W
一样简单,它将匹配所有非单词字符(字母、数字和下划线)。这是
\W
的否定

因此,您的代码变成:

foo.replaceAll("\W","");
正如评论中所指出的,上面也删除了句点,这将有助于保留句点:

foo.replaceAll("[^\w.]","");
详细信息:转义字符类中(字符类中的
^
)、数字、下划线、字母(字符类中的
\w
)或句点(字符类中的
\.

如上所述,您可能希望将其他字符列入白名单:如
-
。只需在继续操作时将它们包含在您的字符类中即可

foo.replaceAll("[^\w.\-]","");

我认为你的正则表达式是一个不错的选择。一般来说,用白色列出值而不是黑色列出值总是比较好的。(只允许你知道的字符是好的,而不是删除所有你认为不好的字符)从安全的角度来看,最好使用这个正则表达式。你永远不会得到一个包含无效字符的inputFilename

suggested regex: [^a-zA-Z-._]

向我们展示您在此之前尝试了什么?您是如何转义这些括号的?文件名中只有少数无效字符。您可能希望返回您的策略,仅删除无效字符,而不是删除白名单a(非常有限)“有效”字符集。有问题的正则表达式是什么?请记住,使用“字符集”分隔符时,大多数特殊字符的行为不再特殊,最大的例外是
-
^
]
。如果
-
是字符集的一部分,它必须出现在开头或结尾。例如,
[-aA]
是有效的,但
[a-a]
从技术上讲是不匹配的,因为它与
-
字符不匹配,但尝试在a和a之间形成一个范围。类似地,
^
仅在不在开始时用作集合中的字符。不确定是否/如何处理
]
。为了避开括号,我使用了
\\\]
的各种组合。我能够让它在一个字符上工作,但一旦我开始寻找两个或更多的字符,什么都没有。我试图用
(或)来描述“这三个字符是转义字符和字符”不走运。在Java正则表达式中,您还可以使用
\Q
\E
来转义它们之间的所有内容。这不会删除“quo”和“.”?它将挑战性地保留下划线,我不是百分之百确定。-需要去查一下。@Tiety如果你是正确的-需要添加句点。下划线被\W-\W覆盖/否定。现在修复。使用@nhahtdh的输入进行调整。我想你在这里得到的结果对于替换一个直接的正则表达式是相当复杂的。你的意思是那一行用通俗易懂的英语准确地说明了它在做什么(即:
replaceChars
)?我的意思是提供一个(可能不完整的)要替换的字符列表而不是regex白名单。你错过了
上的转义。这应该是
^a-zA-Z-\。\u
@Matthew:没必要。我需要检查一下
-
,不过……好吧,在这种情况下似乎没问题,但我会出于安全考虑,把
-
放在最后…@nhahdh感谢你的修改sher在那里-忘记了字符类中不是这种情况。连字符(
-
)也正确。它确实需要转义。