大家好,祝你有个美好的一天。我想问一些愚蠢的问题,因为我正在努力寻找正确的模式。我想找到所有小于或等于长度为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进行了测试。如果可能的话,你可以在这里做例子。我会非常感激任何帮助,并再次原谅我的愚蠢
答案 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)}