java - 如何使用捕获组作为正则表达式中的表达式的开头?

标签 java regex

手头的任务:我正在尝试准备打印自动生成的 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 的 native 正则表达式引擎。

最佳答案

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

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

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

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

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

live demo上进行测试

关于java - 如何使用捕获组作为正则表达式中的表达式的开头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50163961/

相关文章:

java - 这里需要 volatile 吗?

python - 正则表达式在 python 中匹配和清理引号

java - 正则表达式验证仅适用于一个字符

python - 如何显示完整结果,而不是 python 中正则表达式搜索的匹配文本

regex - 如何查找名称中带方括号的文件

java - 无法创建 JAXBContext 创建我的 wsdl

java - 在 Scala 中使用 Java 库

python - 带有日语字符的 re.sub

java - 如何获取四方 field 列表 - Android

java - eclipse 可以将方法转换/重构为类吗?