初学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();
}
}
}
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();
}
}
}
解决方案 »
- 我的jsp文件运行不了
- 请教这样一个现象:C连接Java程序Socket问题
- Type safety: The method add(Object) belongs to the raw type List. References to generic type must be parameterized
- 提问:关于java applet中paint()的问题
- 请问下面的操作符怎么改?
- Iterator的使用问题(急,在线等)
- 帮忙吧,同志们,我的问题一个人都不来回答,YM呀,,时间都有二天了,
- 如何在jbuilder中建立自己的package关系
- JDBC的字符串长度问题,请各位帮助!
- 诚恳的请大家帮助,请问如何实现两个applet之间的通信?谢谢!
- java关键字 synchronized
- 关键字 native
String regex = "[\\|\\/|\\:|\\*|\\?|\\"|\\<|\\>|\\|]";这样?
如果用1L的多选组去写的话是这样
String regex ="[\\\\/:*?\"<>|]";
多选组那大多数元字符都不需要转义
// \/:*?"<>|
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());
at java.io.WinNTFileSystem.createFileExclusively(Native Method)1L的多选组我也试过,我还在想是不是我打错了之类的,复制进去也不行但是我用indexOf是可以的,说明应该不是程序的问题
正则应该是这样的
regex="^.*?[^|<>?\"*:/\\\\].*?$";这样就OK了
.是任意字符?啊啊啊啊好混> <
在String.replaceAll()方法和java.util.regex.Matcher.replaceAll()方法中,$1,$2可以代表引用组
2 yes .*你肯定知道是0个或多个任意字符 .*?是懒惰模式,因为默认.*是贪婪模式,就是会尽可能的匹配更多的字符,当然这里^和$附近都不加?应该也是可以的