使用`String.split`在两个字符序列之间不匹配正则表达式

问题描述 投票:1回答:1

我正在使用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

java regex scala regex-negation regex-lookarounds
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.