手头的任务:我正在尝试准备打印自动生成的 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/