我正在使用Scala处理一些非常混乱的数据,清理它是不切实际的。它以分隔的键值对的形式出现,如下所示:"a=1, b=2, c=3"
。我正在使用String.split
将String分解为键值对。如果需要,引用这些对的大多数字符串值部分,因此这与引号内的,
不匹配:<string-instance>.split(", (?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)")
但是,我遇到了一个url
字段既没有引用也没有在所有情况下进行URL编码,所以我必须处理这样的事情:
"foo=bar, url=http://city.com/Boston, MA US, is_test=false"
在这种情况下,我试图匹配bar
之后的逗号空间和US
之后的逗号空间,并忽略Boston
之后的那个。幸运的是,我可以依赖于url=
和, is_test=
之间发生的这些不良案例(这就是它)。我一直在敲打Java regex测试器:https://www.freeformatter.com/java-regex-tester.html并且失败了。我能得到的最接近的输入是:(?<!url=[.]{0,300}^, is_test), (?!.*, is_test)
,它只匹配US
之后的逗号空间,而不是bar
之后的逗号空间。 {0,300}
用于缓解Java Regex无法处理潜在无限的后视表达式的问题:java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length
我怎么解决这个问题?理想情况下,我可以或使用带引号的逗号空间的表达式忽略一个。一种可能性是在和
url=
之间匹配, is_test
并用%20
替换它们。不幸的是,在那个正则表达式上,我得到的最接近的是(?<=url=.{0,300})\s(?!^\w*, is_test)
,它与is_test
之前的白色空间相匹配,我不想触摸它。
== ==编辑
我的第一个例子没有包含=
的查询字符串,这是我问题的主要部分。以下是我正在处理的更完整的示例:
foo="bar, harbor", url=http://city.com/start_city=Boston, MA US&end_city=New York, NY US, is_test=false