Java中使用正则表达式识别归属同一模式的字符串方法
正则匹配实现方案
完全可以使用正则实现该需求,对应匹配规则如下:
固定前缀匹配
如果你要匹配的公共前缀是固定值(比如示例中的foo),使用以下正则:
^foo(\(\d+\))*$
动态前缀匹配(可自动识别公共前缀)
如果需要匹配任意前缀,后续跟任意层括号包裹的数字,使用以下正则,第一个捕获组返回的就是公共前缀,前缀相同的字符串即为同一类:
^([^\(\d]+)(\(\d+\))*$
正则规则说明
^:匹配字符串起始位置,避免前缀前出现多余字符- 固定前缀场景的
foo可替换为你实际需要的任意固定前缀 - 动态前缀场景的
[^\(\d]+:匹配1个及以上的非左括号、非数字的字符作为前缀,可根据业务调整前缀允许的字符范围 (\(\d+\))*:核心匹配规则\(、\):转义后匹配字面量的左右括号\d+:匹配1个及以上的阿拉伯数字- 外层括号将「括号+数字」打包为一个分组,末尾的
*表示该分组可以出现0次或任意多次,刚好覆盖无括号、单括号、多层括号的所有场景
$:匹配字符串结束位置,避免字符串末尾出现多余字符
匹配效果验证
可匹配的合法字符串
foofoo(1)foo(1234)foo(1)(2)foo(9)(99)(999)(9999)
不可匹配的非法字符串
foobar:前缀超出指定范围foo(a):括号内不是数字foo1:数字没有被括号包裹(1)foo:前缀位置错误foo(1)a:末尾有多余字符
内容的提问来源于stack exchange,提问作者guiqin
相关产品推荐
相关产品推荐

