我想:
删除所有空格,除非它正好在预定义关键字之前或之后(之前 0-1 个空格,之后 0-1 个空格)(例如:and, or, if then 我们在 "and "or "中保留空格和”或“和”不变)
忽略引号之间的一切
我尝试了很多模式。我想出的最接近的是非常接近,但它仍然删除了关键字后的空格,这是我试图避免的。
正则表达式:
\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/