我知道这种类型的问题已经被问了好几次(For example here次或here次),但我的问题似乎不同,因为我找不到解决方案.

假设给我提供了这个字符串:

key=false hotel = trivago foo cool='tr ue' feels="good"

(注意每个空格都是故意放在那里的)

我要提取每一对值,因此Key=False就是其中之一.然而,如果一个单词在一些可选的空格后没有"=",我应该返回word=NULL.否则,这是相关的部分,如果单词在符号‘或"之间,我应该保存这些符号之间的任何内容.举一个例子来解释我的意思: 上面的示例旨在返回此映射:

{key=false, hotel=trivago, foo=null, cool=tr ue, feels=good}

我已经try 了各种模式来解决上面的问题.就我想要的东西而言,我感觉最接近的是: ([a-zA-Z0-9]+)\s*[= ]+(?![^\"']*[\"'])

这个 idea 是:寻找一个数字为([a-zA-Z0-9]+)的单词,后面跟着可选数量的空格.然后查找"=".这部分不是真正的问题(我认为至少...) 这个问题是我想要的一组(2):为了考虑像"东西"或"wo wers"这样的例子,我查阅了上面的链接,并考虑使用否定的前瞻.

我认为这正是我需要的:Group(2)应该包含=符号之后的所有内容.如果有一个",添加字符串中的任何内容,直到我们到达下一个";同样的处理‘.但是,如果没有提到的符号,则在下一个空格停止.

我已经试了好几个小时了,但我不知道还有没有别的.有谁可以帮我?如果您还有任何问题,请随时提问!

编辑:既然我被要求提供更多的例子,下面是:

example with a lot of words. Makes=sense.

应该回来了

{example=null, with=null, a=null, lot=null, of=null, words.=null, Makes=sense.}

另一个例子:

Did=you know that=I like=           "cod ing"?

应该回来了

{Did=you, know=null, that=I, like=cod ing?}

推荐答案

我们可以使用以下正则表达式全部匹配方法:

String input = "key=false hotel    =       trivago foo       cool='tr  ue' feels=\"good\"";
Map<String, String> map = new HashMap<>();
String regex = "(\\S+)\\s*=\\s*(?:'(.*?)'|\"(.*?)\"|(\\S+))";
Pattern r = Pattern.compile(regex);
Matcher m = r.matcher(input);
while (m.find()) {
    String value = m.group(2);
    if (value == null) {
        value = m.group(3) == null ? m.group(4) : m.group(3);
    }
    map.put(m.group(1), value);
}

System.out.println(map);

// {feels=good, cool=tr  ue, hotel=trivago, key=false}

这里使用的正则表达式模式Eager 地try 查找单引号或双引号中的值.如果失败,它将值定义为任何连续的非空格字符组(\S+).

Java相关问答推荐

对于几乎不涉及逻辑的请求,您是否应该使用命令模式?

如何才能使我的程序不会要求两次输入?

具有多种令牌类型和段的复杂Java 17正则表达式

SpringBoot+Java 17@Valid未验证POJO

Spark忽略Iceberg Nessie目录

无法在Java中处理PayPal支付响应

使SLF4J在Android中登录到Logcat,在测试中登录到控制台(Gradle依赖问题)

Kotlin Val是否提供了与Java最终版相同的可见性保证?

与IntArray相比,ArrayList<;Int>;对于大量元素的性能极差

如何读取3个CSV文件并在控制台中按顺序显示?(Java)

如何处理两个几乎相同的XSD文件?

Java.time.OffsetDateTime的SQL Server数据库列类型是什么?

在实例化中指定泛型类型与不指定泛型类型之间的区别

OpenJDK20:JEP434:Foreign Function&;内存API(第二次预览)

错误:JOIN/ON的参数必须是boolean类型,而不是bigint类型.Java Spring启动应用程序

转换为JSON字符串时,日期按天递减-Java

[Guice/MissingImplementation]:未绑定任何实现

如何在Java上为循环数组从synchronized迁移到ReentrantLock

Spring Boot 的 WelcomePageHandlerMapping 在无效的 API 路径上被调用,其中预期出现 404 错误

ArrayAdapter 中何时使用构造函数一和构造函数二?