java - 如何在正则表达式中使用捕获组作为表达式的开始?
问题描述
手头的任务:我正在尝试准备打印自动生成的特定 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 的本机正则表达式引擎。
解决方案
您不需要使事情过于复杂来解决问题:
(?m)^(\w+(?:-\w+){0,2})(?:-(\w+(?:-\w+)*))?$
(?m)
启用多行标志,使^
和$
锚点分别匹配每行的开头和结尾。匹配从匹配单词字符开始,\w+
然后是最多两个-\w+
模式,这些模式首先构建捕获组信息。
第二个捕获组包含后面的任何内容。如果您确定要格式化,您也可以这样做:
(?m)^(\w+(?:-\w+){0,2})(.+)?$
在现场演示中测试它
推荐阅读
- flutter - 未来的建设者给出了失败的断言错误
- python - 迭代元组列表并仅解包第一个元素
- php - 当我尝试存储文件时,它不会存储在 storage\app\public
- javascript - 页面重定向时没有关闭宏伟的弹出窗口
- javascript - 如何在按钮单击时以角度有条件地加载组件
- python - 在不同的列中分离列表,然后在数据框中拆分行
- javascript - TypeScript 是否创建全局变量?
- c++ - 将字符串转换为十六进制格式并将“0x”附加到十六进制值
- rdf - 将 RDF 加载到 Jena Fuseki 的系统要求和替代方法
- javascript - 不要将 URL 添加到浏览器历史记录中