剥去长度小于或大于6的所有数字

时间:2018-01-11 14:22:39

标签: java regex regex-group

大家好,祝你有个美好的一天。我想问一些愚蠢的问题,因为我正在努力寻找正确的模式。我想找到所有小于或等于长度为6的数字字符。

我们来看看下面。例如,我有这个序列

12134 4aRt32212121a 11111111111 222222 asda383652re5

我的解决方案就是这个

\b[0-9]{1,5}\b|\b[0-9]{7,20}\b

我得到的匹配是这个

12134 11111111111

我的问题是我的正则表达式与此处的任何数字都不匹配4aRt32212121a。我希望的比赛将是这个

 12134 4 32212121 11111111111 5

由于长度数等于6,数字将从匹配中排除222222,383652

我使用这个Regex online tool进行了测试。如果可能的话,你可以在这里做例子。我会非常感激任何帮助,并再次原谅我的愚蠢

2 个答案:

答案 0 :(得分:6)

正如Eily在其他评论中提到的,第一个问题是\ b。这是单词边界的锚点,因此它与您建议的单词中的数字不匹配。

我的解决方案是删除\ b,并确保不会出现任何奇怪的情况,添加负面的前瞻和负面的后视以及搜索的结束和开始。

(?<!\d)(\d{1,5}|\d{7,})(?!\d)

编辑:意外输入{1,6}而不是{1,5}

答案 1 :(得分:1)

\w表示字边界,即不在两个\w字符之间的任何地方,其中\b\d表示数字,字母或_。在4aRt32212121a中,3出现在一个字母后面,因此\b无法与之匹配。只需删除所有(?<!\d)(?:[0-9]{1,5}|[0-9]{7,20})(?!\d)

编辑:由于你不想匹配111111内的5位数字,你需要边界条件。通过查看断言,您可以使用:

(?:^|[^\d])(?:[0-9]{1,5}|[0-9]{7,20}) (?:$|[^\d])

否则(您链接到的调试器不支持它们)您必须在匹配中包含行边界或字符:

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun create(obj: I)

@Transaction
fun createAll(objects: List<I>) = objects.forEach {insert(it)}