我有以下字符串:

def str='prop1: value1, prop2: value2;value3, prop3:"test:1234, test1:23;45, test2:34;34", prop4: "test1:66;77, 888"'

我想要以下面的配对列表结束

prop1: value1
prop2: value2;value3
prop3: test:1234, test1:23;45, test4:34;34
prop4: test, 66;77, 888

我想,如果我可以首先解析并go 掉pros3和pros4,那么我就可以简单地在字符串的其余部分用逗号拆分.但是有一个问题,那就是能否找到匹配的4号props

以下是我到目前为止try 过的代码和正则表达式.在代码中注释掉了我try 过的各种正则表达式,但无法提取最后的prop4

  def str='prop1: value1, prop2: value2;value3, prop3:"test:1234, test1:23;45, test4:34;34", prop4: "test, 66;77, 888"'
  //def regex = /(\w+):"(.*)"[,\s$]/
  //def regex = /(\w+):"(.*)"[,|\s|$]/
  def regex = /(\w+):"(.*)"[,\s]|$/
  def m = (str =~ regex)
  (0..<m.count).each{
    println("${m[it][1]}=${m[it][2]}")
  }

这将返回:

prop3=test:1234, test1:23;45, test2:34;34
null=null

我错过了什么吗?

(还有,有没有办法只用一个正则表达式来解析所有这些,而不是我上面描述的方法.首先是正则表达式,然后拆分)

推荐答案

根据给出的示例数据,下面的正则表达式将起作用:

\b(\w+):\s*(\"[^\"]*\"|[^,\"]*)

RegEx Demo

RegEx Demo:

  • \b:单词边界
  • (\w+):捕获组#1 t匹配1+个单词字符
  • ::匹配:
  • \s*:0个或更多空格
  • (: Start capture group #2
    • \"[^\"]*\":匹配引用文本
    • |:或-(用谷歌翻译翻译)
    • [^,\"]*:匹配0个或更多非,"的任何字符
  • ):结束捕获组#2

Java相关问答推荐

在FML中删除关键帧动画

我可以在regex中的字符类中放置断言吗?

将具有多个未知字段的SON映射到Java POJO

为什么如果数组列表中有重复项,我的代码SOMETIMES不返回true?

多个Java线程和TreeMap.put()的非预期行为

如何使用AWS CLI从S3存储桶中的所有对象中删除用户定义的元数据?

条件加载@ManyToMany JPA

当涉及到泛型时,类型推理在Java中是如何工作的?

当返回Mono<;Something>;时,不会调用Mono<;void>;.flatMap

具有阻塞方法的开源库是否应该为执行提供异步选项?

Spring Security不允许加载js

Spring Boot&;Docker:无法执行目标org.springframework.boot:spring-boot-maven-plugin:3.2.0:build-image

JavaFX标签中的奇怪字符

使IntelliJ在导入时优先 Select 一个类或将另一个标记为错误

判断重复的两个二维表算法?

为什么创建Java动态代理需要接口参数

Java CDI:@Singleton@Startup@Inject无法实现接口

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

将天数添加到ZonedDateTime不会更改时间

Spring Integration SFTP 连接失败 - 无法协商 kex 算法的密钥交换