java - 正则表达式删除除关键字周围和引号之间的所有空格

标签 java regex

我想:

  1. 删除所有空格,除非它正好在预定义关键字之前或之后(之前 0-1 个空格,之后 0-1 个空格)(例如:and, or, if then 我们在 "and "or "中保留空格和”或“和”不变)

  2. 忽略引号之间的一切

我尝试了很多模式。我想出的最接近的是非常接近,但它仍然删除了关键字后的空格,这是我试图避免的。

正则表达式:

\s(?!and|or|if)(?=(?:[^"]*"[^"]*")*[^"]*$)

测试字符串:

            if    (ans(this) >= ans({1,2})  and (cond({3,4})  or ans(this) <= ans({5,6})), 7, 8)  and {111} > {222}  or ans(this) = "hello    my friend and  or  " and(cond({1,2}) $1 123     

理想的结果:

 if (ans(this)>=ans({1,2}) and (cond({3,4}) or ans(this)<=ans({5,6})),7,8) and {111}>{222} or ans(this)="hello    my friend and  or  " and(cond({1,2})$1123

然后我可以在 java 中使用 str = str.replaceAll 来删除那些空格。我不介意执行多个步骤来获得结果,但我不熟悉正则表达式,所以有点卡住了。

如有任何帮助,我们将不胜感激!

注意:我编辑了结果。对于那个很抱歉。对于关键字周围的空格:如果有空格则缩小为 1。要么保留它,要么在它为 0 时添加 1 个空格(我只是不想让“or ans”变成“orans”,但是“and(cond”变成“and (cond)”就可以了(缩小到前 1 个空格和 1 个空格如果存在之后)。忽略引号之间的所有内容。

最佳答案

您巧妙地使用了捕获组。这里的一般想法是

match_this|or_this|or_even_this|(but_capture_this)

就正则表达式而言,这可能是

(?:(?:\s+(?:and|or|if)\s+)|"[^"]+")|(\s+)

只有当第一个捕获组不为空时,您才需要替换匹配项。


参见 a demo on regex101.com (使用 (*SKIP*)(*FAIL) 具有相同的目的)。

关于java - 正则表达式删除除关键字周围和引号之间的所有空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58297698/

相关文章:

java - Java中for循环不中断才执行代码的方法有哪些?

java - 如何在指定索引处插入值?

java - 使用 POI 从 Excel 工作表获取日期

javascript - 如何在 Python 中解析 Javascript 正则表达式?

java - 在 Java 和 Javascript 等语言中使用相同的正则表达式

java - 在Java中分割字符串时标记会粘住吗?

java - FileInputStream 和关闭

java - 算法:带有链表缺失项的合并排序

c++ - 提取括号和单引号之间带有单引号的字符串

php - 使用php提取关键字对进行SEO