首页 > 解决方案 > 如何在正则表达式中使用捕获组作为表达式的开始?

问题描述

手头的任务:我正在尝试准备打印自动生成的特定 ID 列表。它们的格式为 aa-bb-cc-dd-ee-ff-gg... 每个元组都可以通过 [a-zA-Z0-9]+ (长度不确定)选择,分隔符为 [-](最大一)。

每个 id 中有 1 到 9 个元组。如果 id 是 3 个元组或更少,我会返回一组。如果 id 超过 3 个元组(4+),那么我将返回两个组,第一个由 3 个元组组成,第二个由其余组组成。

一次只能处理一个字符串。这是测试集:

 one1
 one1-two2
 one1-two2-three3
 one1-two2-three3-4a
 one1-two2-three3-4a-5a
 one1-two2-three3-4a-5a-6a
 one1-two2-three3-4a-5a-6a-7a

具体来说,这意味着:

 one1 -> {"one1"}
 one1-two2 -> {"one1-two2"}
 one1-two2-three3 -> {"one1-two2-three3"}
 one1-two2-three3-4a -> {"one1-two2-three3", "4a"}
 one1-two2-three3-4a-5a -> {"one1-two2-three3", "4a-5a"}
 one1-two2-three3-4a-5a-6a -> {"one1-two2-three3", "4a-5a-6a"}
 one1-two2-three3-4a-5a-6a-7a -> {"one1-two2-three3", "4a-5a-6a-7a"}

到目前为止完成的工作(这总是正确选择第一组)

(^[a-zA-Z0-9]+$)|(^[a-zA-Z0-9]+[-][a-zA-Z0-9]+$)|(^[a-zA-Z0-9]+[-][a-zA-Z0-9]+[-][a-zA-Z0-9]+$)|(^[a-zA-Z0-9]+[-][a-zA-Z0-9]+[-][a-zA-Z0-9]+)

我想要实现的目标:从捕获组的末尾开始,检查它是否不是行尾,在该点之后的第一个 '-' 字符之后开始读取,匹配到行尾。

附加信息:我正在使用 Java 的本机正则表达式引擎。

标签: javaregex

解决方案


您不需要使事情过于复杂来解决问题:

(?m)^(\w+(?:-\w+){0,2})(?:-(\w+(?:-\w+)*))?$

(?m)启用多行标志,使^$锚点分别匹配每行的开头和结尾。匹配从匹配单词字符开始,\w+然后是最多两个-\w+模式,这些模式首先构建捕获组信息。

第二个捕获组包含后面的任何内容。如果您确定要格式化,您也可以这样做:

(?m)^(\w+(?:-\w+){0,2})(.+)?$

在现场演示中测试它


推荐阅读