如何检查特定字符前是否有字符串
问题描述:
虐待尽量保持这个尽可能短:) 所以我有这个代码和它的功能是如此使用户指定的目录中的文件。这段代码的部分包括:如何检查特定字符前是否有字符串
- 找出甚至想让摆在首位
- 文件查找出来的文件名的用户(扫描仪,确保文件名具有扩展名)
- 查找用户指定的目录(扫描仪,检查目录用户输入是否有效,检查目录是否存在,如果不存在,则创建一个新目录)
- 使文件(鉴于该文件不存在)
我的问题在1和2中。
问题1:用户可以输入类似“.txt”的东西,并在实际情况下制作文件时,您需要输入实际名称。 (我做了一些检查,如果该文件有一个扩展也许类似的东西?)
问题2:不要while循环开始部分不退出...为什么...
CODE:
package filecreator;
import java.io.File;
import java.io.IOException;
import java.util.*;
public class FileCreator {
public static Scanner sc = new Scanner(System.in);
public static boolean success = false;
public static String filename;
public static String filedir;
public static String fileexten;
public static String filedir2;
public static File file;
public static File dir;
public static void main(String[] args) throws IOException {
System.out.println("********************************");
System.out.println("* Welcome to File Creator 2.0! *");
System.out.println("********************************");
System.out.println(" ");
//Starting prompt
while(!success) {
System.out.println("Would you like to create a file? Y/N?");
String usrans = sc.nextLine();
if(usrans.equalsIgnoreCase("y")) {
System.out.println("Proceeding with file creation...");
System.out.println(" ");
break;
} else if(usrans.equalsIgnoreCase("n")) {
System.out.println("Exiting Program...");
System.exit(0);
} else if(!usrans.equalsIgnoreCase("y") || !usrans.equalsIgnoreCase("n")) {
System.out.println("That is not a valid answer! Please try again!");
System.out.println(" ");
}
}
System.out.println("Please enter a valid file name:");
//choosing name of file
while(!success) {
filename = sc.nextLine();
fileexten = filename.substring(filename.lastIndexOf(".") + 1);
if(filename.isEmpty()) {
System.out.println("Please enter a file name!");
} else if(filename.contains("/") || filename.contains(":") ||
filename.contains("*") || filename.contains("?") ||
filename.contains("<") || filename.contains(">") ||
filename.contains("|") || filename.contains("\"") ||
filename.contains("\\")) {
System.out.println("Please do not include/\\ : * ? \" < > |");
} else if(!filename.contains(".")) {
System.out.println(" ");
System.out.println("Please specify a valid file extension!");
} else if (fileexten.isEmpty() || fileexten.contains("[^\\p{IsDigit}\\p{IsAlphabetic}]")) {
System.out.println(" ");
System.out.println("Please specify a valid file extension!");
} else {
System.out.println(" ");
System.out.println("File name \"" + filename + "\" chosen");
break;
}
}
System.out.println(" ");
System.out.println("Where would you like to have your file saved?");
System.out.println("Please enter a valid directory");
//finding directory if directory exists and creating one if it dosent
while(!success) {
filedir = sc.nextLine();
dir = new File(filedir);
do {
System.out.println(""
+ "That is not a valid directory");
filedir = sc.nextLine();
} while((!filedir.contains(":") && !filedir.contains("\\")));
System.out.println("Checking to see if directory exists...");
if(!dir.exists()) {
System.out.println("Directory does not exist! Would you like to create one? Y/N?");
String usrans = sc.nextLine();
if(usrans.equalsIgnoreCase("y")) {
dir = new File(filedir);
success = dir.createNewFile();
if(!success) {
System.out.println("Created!");
break;
} else {
System.out.println("Something went wrong! Aborting Program...");
System.exit(0);
}
} else if(usrans.equalsIgnoreCase("n")) {
System.out.println("Directory not created! Aborting program...");
System.exit(0);
} else if(!usrans.equalsIgnoreCase("y") || !usrans.equalsIgnoreCase("n")) {
System.out.println("That is not a valid answer!");
}
}
}
System.out.println(" ");
System.out.println("Looking to see if \"" + filename + "\" already exists...");
file = new File(filedir,filename);
if(file.exists()) {
System.out.println(" ");
System.out.println("\"" + filename + "\"" + " already exists! Closing Program...");
System.exit(0);
} else {
System.out.println(" ");
System.out.println("\"" + filename + "\"" + " doesn't exists! Creating now...");
file.createNewFile();
success = file.createNewFile();
if(!success) {
System.out.println(" ");
System.out.println("\"" + filename + "\"" + " successfully created!");
} else {
System.out.println(" ");
System.out.println("Error! File not created");
}
}
}
}
答
解决方法1:使用下列检查文件名的有效性,而不是那些长期有条件的条款。
if (filename.toLowerCase().matches("[a-z0-9_-][a-z0-9_.-]*\\.[a-z0-9]+"))
解决方案2:因为你的程序需要用户输入ň戒烟,而不是由自身完成。
答
关于第一个问题,你可以创建一个regex to validate the filename:
boolean validFilename = filename.matches("[_a-zA-Z0-9\\-\\.]+"); //regex to validate a filename
if(!validFilename){
//output error to user and ask to try again
}
关于第二个问题,你asigning你success
变量设置为false,你是不是改变其值。然后你而条件while(!success)
将始终返回true,你的循环将运行“永远”
+0
它不是被卡住的while循环。它的dir后面的do while循环被声明为一个新文件 –
听起来像是你需要一个正则表达式 – MyStackRunnethOver
@MyStackRunnethOver可以PLZ详细点吗? –
哪个循环不退出?你能发表一个你的输入的例子,以及重复哪些打印输出? – Assafs