正则表达式来选择所有不在引号中的空格?
我不是很擅长正则表达式,有人可以给我一个正则表达式(在Java中使用)来选择所有不在两个引号之间的空格吗?我正在尝试从字符串中删除所有此类空格,因此任何执行此操作的解决方案都可以使用。
例如:
(这是一个测试“正则表达式的句子”)
应该成为
(这个最讨厌的“正则表达式的句子”)
我不是很擅长正则表达式,有人可以给我一个正则表达式(在Java中使用)来选择所有不在两个引号之间的空格吗?我正在尝试从字符串中删除所有此类空格,因此任何执行此操作的解决方案都可以使用。
例如:
(这是一个测试“正则表达式的句子”)
应该成为
(这个最讨厌的“正则表达式的句子”)
下面是一个有效的正则表达式替换:
\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)
这是适用于单引号和双引号的正则表达式(假设所有字符串都正确分隔)
\s+(?=(?:[^\'"]*[\'"][^\'"]*[\'"])*[^\'"]*$)
它不适用于内部有引号的字符串。