替换fileName中的非法字符

bbh*_*zbb 48 java regex replace

在Java中,我有一个文件名字符串.在那里,我想用'_'替换所有非法字符,但不是a-z,0-9-,._

我试过以下代码:但是这没用!

myString = myString.replaceAll("[\\W][^\\.][^-][^_]", "_");
Run Code Online (Sandbox Code Playgroud)

poi*_*oae 91

你需要更换一切,但是[a-zA-Z0-9.-].在^括号内表示"不".

myString = myString.replaceAll("[^a-zA-Z0-9\\.\\-]", "_");
Run Code Online (Sandbox Code Playgroud)

  • 你真的应该在发布之前测试你的代码......必须转义`.`和`-`!我设法让这个正则表达式工作:`[^ a-zA-Z0-9 _ \\ - \\.]` (23认同)
  • 我知道范围尚未明确定义,但有更多有效字符而不仅仅是0-9和az.外语怎么样?对于Windows,请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx. (8认同)
  • @bbholzbb我不这么认为. (7认同)
  • @Erk"在大多数正则表达式中,字符类中唯一的特殊字符或元字符是右括号(]),反斜杠(\\),插入符号(^)和连字符( - ).通常的元字符是字符类中的普通字符,不需要用反斜杠转义.要搜索星号或加号,请使用[+*].如果你逃避字符类中的常规元字符,你的正则表达式将正常工作,但是因此大大降低了可读性." [regular-expressions.info](http://www.regular-expressions.info/charclass.html) (7认同)
  • 其他UTF-8角色怎么样?我的意思是其他语言? (4认同)
  • @Erk:我测试过`[^.]`不替换句点.我理解你的观点,这与我们应该使用括号用于单语句条件的最佳实践相似,即使它们不是"必需的",但值得纠正错误的假设".并且 - 必须被转义".字符类的处理方式与正则表达式的其余部分完全不同,它们的用户应该理解这种区别.(考虑到如果`.`和`*`在字符类中被视为通配符,那么`[.]`,`[*]`和`[az*.]`都将等同于`.`. ) (3认同)

小智 20

如果您正在寻找Windows平台上的选项,那么您可以尝试以下解决方案,以使用文件名中除"\ /:*?"<> |"以外的所有有效字符.

fileName = fileName.replaceAll("[\\\\/:*?\"<>|]", "_");
Run Code Online (Sandbox Code Playgroud)

  • 你可以用全宽对应物替换非法字符:`/ \\:*?"<> |` (2认同)

Mat*_*all 15

把事情简单化.

myString = myString.replaceAll("[^a-zA-Z0-9.-]", "_");
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/TINsr4

  • 是否有任何可用的 Java API 可以解决这个问题?由于进一步的兼容性问题。我的意思是这种手动替换可能会在 Windows 以外的其他环境中产生一些错误。 (2认同)
  • @rajper不是AFAIK.最简单的方法是确定要支持的所有平台上的所有非法字符集,并将它们全部替换掉​​. (2认同)

Iva*_*nRF 7

更简单

myString = myString.replaceAll("[^\\w.-]", "_");
Run Code Online (Sandbox Code Playgroud)

预定义字符类:

  • \w 一个字符: [a-zA-Z_0-9]