正则表达式来选择所有不在引号中的空格?

2022-09-01 04:19:56

我不是很擅长正则表达式,有人可以给我一个正则表达式(在Java中使用)来选择所有不在两个引号之间的空格吗?我正在尝试从字符串中删除所有此类空格,因此任何执行此操作的解决方案都可以使用。

例如:

(这是一个测试“正则表达式的句子”)

应该成为

(这个最讨厌的“正则表达式的句子”)


答案 1

下面是一个有效的正则表达式替换:

\s+(?=([^"]*"[^"]*")*[^"]*$)

这将取代:

(this is a test "sentence for the regex" foo bar)

跟:

(thisisatest"sentence for the regex"foobar)

请注意,如果引号可以转义,则更冗长的正则表达式将起作用:

\s+(?=((\\[\\"]|[^\\"])*"(\\[\\"]|[^\\"])*")*(\\[\\"]|[^\\"])*$)

这将替换输入:

(this is a test "sentence \"for the regex" foo bar)

跟:

(thisisatest"sentence \"for the regex"foobar)

(请注意,它也适用于转义的退格符:(thisisatest“句子 \\\”对于正则表达式“foobar)

毋庸置疑(?),这真的不应该用于执行这样的任务:它使人们的眼睛流血,并且在二次时间内执行其任务,而存在一个简单的线性解决方案。

编辑

快速演示:

String text = "(this is a test \"sentence \\\"for the regex\" foo bar)";
String regex = "\\s+(?=((\\\\[\\\\\"]|[^\\\\\"])*\"(\\\\[\\\\\"]|[^\\\\\"])*\")*(\\\\[\\\\\"]|[^\\\\\"])*$)";
System.out.println(text.replaceAll(regex, ""));

// output: (thisisatest"sentence \"for the regex"foobar)

答案 2

这是适用于单引号和双引号的正则表达式(假设所有字符串都正确分隔)

\s+(?=(?:[^\'"]*[\'"][^\'"]*[\'"])*[^\'"]*$)

它不适用于内部有引号的字符串。

Regular expression visualization