如何从字符串中删除引号中的子字符串? (没有正则表达式)

时间:2017-01-26 19:50:20

标签: java string

我有一个包含以下内容的文本文件: 鲍勃去了商店"商店去"买牛奶"买牛奶。

我想从string1删除所有引用的材料,因此它只包含:Bob去商店购买牛奶。

有没有办法在不使用正则表达式的情况下执行此操作?我目前正在尝试使用split()方法。我首先使用split()将文本文件读入名为string1的String变量,然后将值存储回名为newString的新字符串。

String string1 = new Scanner(new File("C:/bob.txt")).useDelimeter("\\A").next();       
String newString = "";

String[] arr = string1.split("\"");
for (int i=0; i<arr.length-1; i++){
    newString += arr[y];
}

我对java很新,不确定我是否正确使用了split方法。当我打印出newString时,它显示为&#34;鲍勃去商店购买牛奶&#34;

我的问题是应该说&#34;鲍勃去商店买牛奶。&#34;该字符串在结尾处缺少句点,并写入&#34;商店&#34;两次。

任何人都可以帮我做这项工作吗? (如果有一个比split()更好的方法,我想知道。我也希望它适用于任意数量的引用部分的字符串。也没有模式匹配/正则表达式)谢谢!

2 个答案:

答案 0 :(得分:1)

这样可行:

public static void main(String[] args) {
    String str = "Bob went to \"the store\" the store to \"buy milk\" buy milk.";
    boolean inQuotes = false;
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < str.length(); i++) {
        if (str.charAt(i) == '"') inQuotes = !inQuotes;
        else if (!inQuotes) sb.append(str.charAt(i));
    }
    System.out.println(sb.toString());
}

请注意,结果"Bob went to the store to buy milk."to the storeto buy milk之间有两个空格,因为它只删除了引号之间的内容。

答案 1 :(得分:0)

您可以使用Java 8的marketplace/Model/Datasource/DboSource流式传输stream的{​​{1}},并通过character array跳过双引号,例如:

string

另一种方法是简单地遍历filter数组并跳过双引号,例如:

String s = "Bob blah blah \"quote\" blah \"another quote\"";
System.out.println(s);
String string = s.chars()
.filter(c -> c != '"')
.collect(StringBuilder::new, 
        StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
System.out.println(string);