我试图从一长串文本中提取长度为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,然后在结果上运行较小长度的匹配器。这样我就减少了一遍又一遍地读取数据,在我的情况下,这是一个外部来源。
答案 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<>