[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
是的,想法是:匹配一个空格,最后是任意数量的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(?=("[^"]*"|[^"])*$)
也应该在那里工作。
您可以这样操作((使用dot-all修饰符,或在正则表达式的开头插入(?s))查找:
raw: ("[^"\\]*(?:\\.[^"\\]*)*")|(\s+)
quoted: "(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\")|(\\s+)"
替换:
$1
输出:
{"my key name":"my key value","foo":["bar","baz"]}
展开]
# ("[^"\\]*(?:\\.[^"\\]*)*")|(\s+)
( # (1 start)
"
[^"\\]*
(?: \\ . [^"\\]* )*
"
) # (1 end)
|
( \s+ ) # (2)