初学JAVA,在做一个保存功能的时候,想判断一下文件名,用indexOf实在有点多,想用正则表达式,自己研究了半天,总是有问题,故来请教各位高手判断字符串里面是否包含“\/:*?"<>|”这些字符的正则表达式
private void saveAs() {
int saveChooser=fileChooser.showSaveDialog(Ex01.rootPane);
if (saveChooser==JFileChooser.APPROVE_OPTION) {
saveFile=fileChooser.getSelectedFile();
String regex=""; //我想写一个能判断文件名里面是否包含“\/:*?"<>|”这些字符的正则表达式
String[] fileNames=saveFile.getName().split("\\.");
if (fileNames[fileNames.length-1].equals("txt")) {
for (int i=0; i<(fileNames.length-1); i++) {
fileName+=fileNames[i];
}
} else {
for (int i=0; i<fileNames.length; i++) {
fileName+=fileNames[i];
}
}
if (fileName.matches(regex) && !fileName.equals("")) {
saveFile=new File(saveFile.getParent(),fileName+".txt");
if (saveFile.exists()) {
int isReplace=JOptionPane.showConfirmDialog(Ex01.rootPane, saveFile.getName()+"已存在,是否替换?", "另存为", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if (isReplace==0) {
save();
} else {
saveAs();
}
} else {
try {
saveFile.createNewFile();
save();
} catch (Exception err) {
err.printStackTrace();
}
}
} else {
JOptionPane.showMessageDialog(Ex01.rootPane, "无效文件名,文件名不能包含以下任何字符:\\/:*?\"<>|,并且不能为空", "另存为", JOptionPane.WARNING_MESSAGE);
saveAs();
}
}
}

解决方案 »

  1.   


    String regex = "[\\|\\/|\\:|\\*|\\?|\\"|\\<|\\>|\\|]";这样?
      

  2.   

    虽然感谢回答,但是这个肯定错了,首先“\”是“\\\\”,还有“\\"”这个肯定通不过编译的。。啊啊啊啊,正则表达式真烦> <
      

  3.   

    String regex = "\\\\|/|:|\\*|\\?|\"|<|>|||"; 匹配字符串中包含\/:*?"<>|任意一个字符
      

  4.   


    如果用1L的多选组去写的话是这样
    String regex ="[\\\\/:*?\"<>|]";
    多选组那大多数元字符都不需要转义
      

  5.   

    这个String regex = "\\\\|/|:|\\*|\\?|\"|<|>|\\|";
      

  6.   

    完美测试通过
    //     \/:*?"<>|

    String fileName="?";
                    //String fileName="\\";
                      //String fileName="/";
                     //String fileName="<";
                      //  String fileName="|";
    String regex="[|<>?\"*:/\\\\]";
     Matcher m=Pattern.compile(regex).matcher(fileName);
    System.out.println("fileName-->"+fileName+"\nm.find-->"+m.find());
      

  7.   

    不行T T,其实这个我也试过,不知为何不行,就弹出啥文件名、目录名或卷标语法不正确。
    at java.io.WinNTFileSystem.createFileExclusively(Native Method)1L的多选组我也试过,我还在想是不是我打错了之类的,复制进去也不行但是我用indexOf是可以的,说明应该不是程序的问题
      

  8.   

    楼主如果你的语句什么都不改的话  if (fileName.matches(regex) && !fileName.equals("")) {
    正则应该是这样的
    regex="^.*?[^|<>?\"*:/\\\\].*?$";这样就OK了
      

  9.   

    OK了,去研究了一下,原来是find和matches的关系。LS,能否解释一下两边的^.*?和.*?$,我不是很明白,我只知道单独的意思,写在一起就有点混^是开头?$是结束?
    .是任意字符?啊啊啊啊好混> <
      

  10.   

    1yes  ^表示开头,$代表结束..但如果这样[^a]就代表取反,就是非a的任何字符
         在String.replaceAll()方法和java.util.regex.Matcher.replaceAll()方法中,$1,$2可以代表引用组
    2 yes .*你肯定知道是0个或多个任意字符  .*?是懒惰模式,因为默认.*是贪婪模式,就是会尽可能的匹配更多的字符,当然这里^和$附近都不加?应该也是可以的