gpt4 book ai didi

java - 如何使用正则表达式从文本中删除空格和换行符(除非它们位于 json 字符串中)?

转载 作者:行者123 更新时间:2023-12-01 23:39:17 24 4
gpt4 key购买 nike

我有这样的指令:

db.insert( {
_id:3,
cost:{_0:11},
description:"This is a description.\nCool, isn\'t it?"
});

我正在使用的名为 MonjaDB 的 Eclipse 插件通过换行符分割指令,并且我将每一行作为单独的指令,这很糟糕。我使用 ;(\r|\n)+ 修复了它,它现在包含整个指令,但是,在清理 JSON 各部分之间的换行符时,它还会清理 json 本身的字符串内的\n 和\r。

如何避免从 JSON 字符串中删除\t、\r、\n?当然,它们是用“”或“”分隔的。

最佳答案

当空格出现在引号中时,您需要安排忽略它。正如一位评论者所建议的:

\s+ | ( "  (?: [^"\\]  |  \\ . ) * " )              // White-space inserted for readability

匹配 java 空格或双引号字符串,其中字符串由 " 后跟任何非转义符、非引号或转义符 + 加任何字符组成,最后是 "。这样,字符串内的空格就不会匹配。

如果 $1 不为空,则替换为 $1。

    Pattern clean = Pattern.compile(" \\s+ | ( \" (?: [^\"\\\\] | \\\\ . ) * \" ) ", Pattern.COMMENTS | Pattern.DOTALL);

StringBuffer sb = new StringBuffer();
Matcher m = clean.matcher( json );
while (m.find()) {
m.appendReplacement(sb, "" );
// Don't put m.group(1) in the appendReplacement because if it happens to contain $1 or $2 you'll get an error.
if ( m.group(1) != null )
sb.append( m.group(1) );
}
m.appendTail(sb);

String cleanJson = sb.toString();

这完全超出了我的想象,但我很确定它接近你想要的。

编辑:我刚刚访问了 Java IDE 并尝试了我的解决方案。我的代码犯了一些错误,包括在模式中使用 \. 而不是 . 。所以我已经修复了这个问题并在您的示例的变体上运行它:

db.insert( {
_id:3,
cost:{_0:11},
description:"This is a \"description\" with an embedded newline: \"\n\".\nCool, isn\'t it?"
});

代码:

    String json = "db.insert( {\n" +
" _id:3,\n" +
" cost:{_0:11},\n" +
" description:\"This is a \\\"description\\\" with an embedded newline: \\\"\\n\\\".\\nCool, isn\\'t it?\"\n" +
"});";

// insert above code

System.out.println(cleanJson);

这会产生:

db.insert({_id:3,cost:{_0:11},description:"This is a \"description\" with an embedded newline: \"\n\".\nCool, isn\'t it?"});

这是相同的 json 表达式,删除了带引号的字符串外部的所有空格,并在带引号的字符串内部保留了空格和换行符。

关于java - 如何使用正则表达式从文本中删除空格和换行符(除非它们位于 json 字符串中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18203676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com