首页 > 解决方案 > 没有正则表达式形式的连续字符数

问题描述

如何找出没有正则表达式形式的连续字符的数量。例如,我有一个文本“youarenovalid21”,而正则表达式是“(\d+)”,所以我们不能引出最多 14 个字符的内容,因为文本没有数字。所以我想保存文本没有正则表达式形式的字符数为 13。谢谢。

标签: javaregex

解决方案


要获取正则表达式跳过的文本,请记住初始位置 ( 0)/上一个正则表达式匹配 ( m.end()) 之后的下一个位置,然后将其与匹配的开始位置进行比较,如m.start().

例子

String input = "youarenovalid21";
Matcher m = Pattern.compile("\\d+").matcher(input);
int start = 0;
while (m.find()) {
    if (start < m.start())
        System.out.println("Not in regex: " + input.substring(start, m.start()));
    System.out.println("In regex: " + m.group());
    start = m.end();
}
if (start < input.length())
    System.out.println("Not in regex: " + input.substring(start));

输出

Not in regex: youarenovalid
In regex: 21

示例 2

String input = "1a22bb333ccc4444dddd";

输出

In regex: 1
Not in regex: a
In regex: 22
Not in regex: bb
In regex: 333
Not in regex: ccc
In regex: 4444
Not in regex: dddd

或者,您确保正则表达式将始终获取所有内容:

String input = "1a22bb333ccc4444dddd";
for (Matcher m = Pattern.compile("(\\D*)(\\d*)").matcher(input); m.find(); ) {
    if (m.start(1) < m.end(1))
        System.out.println("Not digits: " + m.group(1));
    if (m.start(2) < m.end(2))
        System.out.println("Digits: " + m.group(2));
}

输出

Digits: 1
Not digits: a
Digits: 22
Not digits: bb
Digits: 333
Not digits: ccc
Digits: 4444
Not digits: dddd

推荐阅读