正则表达式提取所有长度的数字

时间:2014-03-19 18:53:14

标签: java regex

我试图从一长串文本中提取长度为3到5的数字。让我解释一下

假设有一个像123456这样的字符串,我想提取长度为3到5之间的所有数字

123
234
345
456
1234
2345
3456
12345
23456

我可以运行多个单独找到长度的正则表达式,但可能有比我正在做的更好的方法。

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTestHarness {

    public static void main(String[] args) throws IOException {

        String data = "123456";

        Matcher m = Pattern.compile("\\d{3}").matcher(data);

        // m = Pattern.compile("\\d{4}").matcher(data);
        // m = Pattern.compile("\\d{5}").matcher(data);

        int position = 0;

        while (m.find(position++)) {
            System.out.println(m.group());
        }
    }
}

过早优化的想法 - 我可以将所有内容都匹配到5,然后在结果上运行较小长度的匹配器。这样我就减少了一遍又一遍地读取数据,在我的情况下,这是一个外部来源。

3 个答案:

答案 0 :(得分:2)

使用正则表达式看起来要困难得多。如果您不需要使用它,请遍历每个起始位置并提取数字:

// If this string is just plain numbers, skip the dataArray and the
// for (String s: dataArray) and replace the s's in the loops with data's

String data = "123456 some other datas 654321";
String[] dataArray = data.split("\\D+");

for (String s: dataArray){
    for (int length = 3; length <= 5; length++){
        for (int index = 0; index <= s.length() - length; index++) {
            int maxIndex = index + length;
            System.out.println(s.substring(index, maxIndex));
        }
    }
}

输出:

123
234
345
456
1234
2345
3456
12345
23456
654
543
432
321
6543
5432
4321
65432
54321

答案 1 :(得分:2)

您可以使用单个正则表达式执行此操作。全球发现。
如果长度大于0,则打印捕获组1,2,3

 #  "(?=(\\d{3}))(?=(\\d{4}))?(?=(\\d{5}))?"

 (?=
      ( \d{3} )         # (1)
 )
 (?=
      ( \d{4} )         # (2)
 )?
 (?=
      ( \d{5} )         # (3)
 )?

Perl测试用例

while ( '123456' =~ /(?=(\d{3}))(?=(\d{4}))?(?=(\d{5}))?/g )
{
     print "$1\n";
     if ( length ($2) ) {
         print "$2\n";
     }
     if ( length ($3) ) {
         print "$3\n";
     }
}

输出&gt;&gt;

123
1234
12345
234
2345
23456
345
3456
456

答案 2 :(得分:0)

尝试此解决方案仅适用于3-5场比赛。我正在使用预测从字符串中找到重叠匹配。我几乎在这里使用了三个正则表达式。

String text = "123456";
Pattern pattern = Pattern.compile("(?=(\\d\\d\\d))(?=(\\d\\d\\d\\d?))(?=(\\d\\d\\d\\d?\\d?))");
Matcher m = pattern.matcher(text);

// taking out all the captures from the Matcher
List<String> list = new ArrayList<String>();
while (m.find()) {
    list.add(m.group(1));
    list.add(m.group(2));
    list.add(m.group(3));
}

// making the list unique using HashSet
list = new ArrayList<String>(new HashSet<String>(list));

// printing
for(String s : list){
    System.out.println(s);
}

// output is not sorted, if you want you can sort the List<>