输入字符串是:"outer string "inside a quote" "
输出应该是:"outer string inside a quote "
请建议任何正则表达式来查找内部双引号并使用 Java 替换为空格。
输入字符串是:"outer string "inside a quote" "
输出应该是:"outer string inside a quote "
请建议任何正则表达式来查找内部双引号并使用 Java 替换为空格。
您可以通过这种方式尝试,无需正则表达式,只需一次迭代:
/*
* I assume that if after quote ther is character like "a then it is
* beggining of cite. Rest quotes are closing ones.
*/
public static String removeInnerQuotes(String data) {
StringBuilder sb = new StringBuilder();
int quoteCounter = 0;
char[] array = data.toCharArray();
for (int i = 0; i < array.length; i++) {
if (array[i] == '"') {
if (i + 1 < array.length
&& (
(array[i + 1] >= 'a' && array[i + 1] <= 'z')
||
(array[i + 1] >= 'A' && array[i + 1] <= 'Z')
)
){
quoteCounter++;
if (quoteCounter == 1)
sb.append('"');
}
else{
quoteCounter--;
if (quoteCounter == 0)
sb.append('"');
}
} else
sb.append(array[i]);
}
return sb.toString();
}
public static void main(String[] args) {
String data = "\"outer string \"inside a quote\" abc\" something outside quote, and again \"outer string \"inside a quote\" def \"";
System.out.println(removeInnerQuotes(data));
}
输出:
"outer string inside a quote abc" something outside quote, and again "outer string inside a quote def "
假设只有一层嵌套,外引号内只有一个内引号,以下应该有效:
str.replaceAll("\"(\\b[^\"]+)?\"\\b([^\"]+)\\b\"([^\"]+\\b)?\"","\"$1$2$3\"");
它试图通过单词边界检测开引号和闭引号。要允许外引号和内引号之间有空格(而不是单词),甚至内引号中没有空格,请使用以下命令:
str.replaceAll("\"(\\b[^\"]+|\\s+)?\"(\\b[^\"]+\\b)?\"([^\"]+\\b|\\s+)?\"","\"$1$2$3\"");
我认为对于这种情况,一个正则表达式解决方案(如果可用)可能会稍微复杂一些以保持可维护性。
你可以做的是有这样的事情:
String str = "outer string "inside a quote" ";
String newStr = "\"" + str.replaceAll("\"","") + "\";
上面的代码将删除所有引号并在字符串的开头和结尾添加一个。
编辑:
我想出了这个,它有点令人费解,但它似乎确实有效:
String str = "sdsadsaasdasdsadas\"sadsad\"the is sparta\"asdsadsa\"sdassa";
String newStr = str.replaceAll("(\".*?)\"(.*?)\"(.*?\")", "$1$2$3");
System.out.println(newStr);
它产生:
sdsadsaasdasdsadas"sadsadthe is spartaasdsadsa"sdassa
上面的正则表达式基本上将文本分成 3 个部分,第一组引号之前的部分,内部引号之间的集合和内部引号之后的部分。然后它重建字符串。
编辑:
我使用此代码从文件中读取字符串(注意本例中的字符串是 1 行)
Scanner input = new Scanner(new File(filePath));
StringBuilder sb = new StringBuilder();
while (input.hasNextLine())
{
sb.append(input.nextLine().trim()).append(" ");
}
input.close();
String str = sb.toString().trim();
String newStr = str.replaceAll("(\".*?)\"(.*?)\"(.*?\")", "$1$2$3");
System.out.println(newStr);
它产生了:
“引号内的外部字符串”