我可以使用正则表达式删除“引号之间的任何空白”吗?

问题描述 投票:0回答:3

[Regex string matching everything not wrapped涵盖了在不同的定界符之外检索字符的任务,但是是否可以对相同的定界符执行相同的操作?

换句话说,我知道一个正则表达式可以匹配两个不相同字符(例如><)的定界符之间的文本,但是可以匹配两个相等之间not的文本分隔符(即"")。

示例:

之前:

{ "my key name":
      "my key value",
"foo": ["bar", "baz"]  }

除去空格后不要在引号之间:

{"my key name":"my key value","foo":["bar","baz"]}

到目前为止,this is the only regex I've hacked together that does anything similar at all,但即使如此,它也不能全部解决,而且我确定我错过了一些事情:

/(\s+?(?={))|(^\s+)|(\r|\n)|((?=[\[:,])\s+)/gm
java regex string removing-whitespace
3个回答
3
投票

是的,想法是:匹配一个空格,最后是任意数量的1)带引号的字符串或2)非引号。

Python示例:

import re

text = """
{ "my key name":
      "my key value",
"foo": ["b a r", "b a z"]  }
"""

rx = r"""(?x)
    \s
    (?=
        (
            " [^"]* "
            |
            [^"]
        ) *
        $
    )
"""

print re.sub(rx, '', text)
# {"my key name":"my key value","foo":["b a r","b a z"]}

我看到已经添加了Java标签...我不知道Java,但是上面的正则表达式具有可移植的形式

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

也应该在那里工作。


1
投票

您可以这样操作((使用dot-all修饰符,或在正则表达式的开头插入(?s))查找:

raw:     ("[^"\\]*(?:\\.[^"\\]*)*")|(\s+)
quoted:  "(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\")|(\\s+)"

替换:

$1

输出:

{"my key name":"my key value","foo":["bar","baz"]}

展开]

   # ("[^"\\]*(?:\\.[^"\\]*)*")|(\s+)

   (                             # (1 start)
        "
        [^"\\]* 
        (?: \\ . [^"\\]* )*
        "
   )                             # (1 end)
|  
   ( \s+ )                       # (2)

© www.soinside.com 2019 - 2024. All rights reserved.