具有替代项的正则表达式捕获组不匹配

如何解决具有替代项的正则表达式捕获组不匹配

我有以下字符串,我想在其中匹配有效的 <key>:<value> 对。

有效的 <key> 是任何带有非空白字符后跟 :
一个有效的 <value> 要么包含在 [] 中,要么是一个没有空格的字符串。

key1:value1 key#2:@value#2 nyet key3:[@value#3,value4] key4:[value5] :bar

基本上我想匹配除 nyet:bar 之外的所有内容

我想出了以下正则表达式 \S+:(\S+|\[[^]]+\]),但它似乎与 key3:[@value#3,value4] 中的表达式不匹配。在捕获组中,第二个选项 \[[^]]+\] 应该匹配这个表达式,所以我不明白为什么它不匹配。

以下正则表达式有效:\S+:([^([ )]+|\[[^\]]+\]) 但感觉不优雅。

问题:

  1. 为什么第一个正则表达式 \S+:(\S+|\[[^]]+\]) 不起作用?
  2. 更优雅的解决方案如何匹配键值对?

解决方法

在模式中,您可以 switch the alternatives \S+:(\[[^]]+\]|\S+) 但在这种情况下也将匹配 []

您还可以使用否定字符类来 exclude 匹配第一部分 : 中的 [^\s:]+:(\[[^]]+]|\S+)

对于组,您可以使用交替并检查值是否存在组 2 或组 3。

([^\s:]+):(?:\[([^][]+)]|(\S+))

模式匹配:

  • ([^\s:]+) 捕获组 1,匹配除空白字符或 :
  • 之外的任何字符
  • : 匹配 :
  • (?: 非捕获组
    • \[([^][]+)] 匹配 group 2 中除 [[ 之外的任何字符的 ] 捕获并匹配结束 ]立>
    • |
    • (\S+)group 3
    • 中捕获 1+ 个非空白字符
  • ) 关闭非捕获组

Regex demo


如果支持 conditional,您可以检查组 2 是否捕获了 [。如果是这样,您可以捕获除第 3 组中的括号之外的任何字符。

您想要的值在第 1 组和第 3 组中。

([^\s:]+):(?:(\[)(?=[^][]*]))?((?(2)[^][]+|\S+))\]?

Regex demo

,
  1. 你对你的正则表达式很熟悉。它失败了,因为 :\S 的优先级高于 :\[
  2. 这个正则表达式有效:
/\S+:(?:\[[^\]]*\]|\S+)/g

说明:

  • \S+: - 1+ 个非空格字符和一个冒号
  • (?: - 非捕获组开始(用于 OR)
    • \[[^\]]*\] - [...] 模式
    • | - 逻辑 OR
    • \S+ - 1+ 个非空格字符
  • ) - 非捕获组结束

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?