我想制作一个JAVA程序,将指定文件的指定内容全部删除,但不删除被""括起来的部分(即使有要删除的内容)。但是一直做不到,下面是代码:
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Scanner;
public class pre {
public static String sj;
public static String sj2;
public static void main(String[] args) throws IOException{
Scanner scan = new Scanner(System.in);
System.out.print("请输入文件路径:");
String cvjlwj = scan.nextLine();
System.out.print("请输入删除内容:");
String nuirong = scan.nextLine();
File f = new File(cvjlwj);
String Name = f.getName();
scan.close();
Path cvjl = Paths.get(cvjlwj);
List wj = Files.readAllLines(cvjl, StandardCharsets.UTF_8);
String[] sj0 = wj.toArray(new String[wj.size()]);
sj = sj0[(int) Math.floor(Math.random())];
sj2 = sj.replace(nuirong,"");
sj = sj2;
Files.write(Paths.get(Name),sj.getBytes(StandardCharsets.UTF_8));
}
}
如果用户输入的文件内容如下:
10101010100101100"1010101010"
要求删除“1”。
则按照我的想法,应当输出:
000000000"1010101010"
实际上我只能做到:
000000000"00000"
即把所有的“1”删除了。
看看这个是否满足你的需求
public static void main(String[] args) {
String str = "10101010100101100\"1010101010\"1111101122223\"1990\"";
/*
* 1、先将双引号的内容保存起来(记住之前的位置),同时将其它内容也单独保存起来;
* 2、替换目标字符,比如:1
* 3、将双引号中内容放回到原处
*/
int index = -1;
int start = 0;
List<String> temp = new ArrayList<>();
StringBuilder sb = new StringBuilder();
char[] chs = str.toCharArray();
for(int i=0; i<chs.length; i++){
if(chs[i] != '\"'){
continue;
}
if(index == -1){
index = i;
} else {
temp.add(str.substring(index,i + 1));
sb.append(str, start, index);
sb.append("#");//留一个占位符,占位符一定文件中不存在的字符
index = -1;
start = i + 1;
}
}
if(start < chs.length){
sb.append(str, start, chs.length);
}
str = sb.toString().replace("1","");//替换目标字符
index = 0;
while (str.contains("#")){
str = str.replaceFirst("#",temp.get(index++));//然后替换占位符
}
System.out.println(str);
}
写了个比较复杂点的处理方法,请参考:
/* 替换除去""之外字符串中的内容 */
public static String replaceString(String str, String target, String replacement) {
List<String> list = new ArrayList<>();
char[] chars = str.toCharArray();
int startIndex = 0;
int endIndex = 0;
for (int i = 0; i < chars.length; i++) {
char c = chars[i];
if (c == '\"') {
if (endIndex < startIndex) {
i++;
list.add(str.substring(startIndex, i));
endIndex = i;
startIndex = i + 1;
} else {
if (i != startIndex) {
list.add(str.substring(startIndex, i));
}
}
startIndex = i;
}
if (i == chars.length - 1) {
if (i != startIndex) {
list.add(str.substring(startIndex, i));
}
}
}
System.out.println(list);
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
if (!s.contains("\"")) {
s = s.replace(target, replacement);
list.set(i, s);
}
}
System.out.println(list);
StringBuffer sb = new StringBuffer();
for (String s : list) {
sb.append(s);
}
String newStr = sb.toString();
return newStr;
}