在捕获的组上应用正则表达式

时间:2015-05-14 07:38:06

标签: java regex

我是Java的新手,特别是regex 我有一个类似于:

的CSV文件
col1,col2,clo3,col4
word1,date1,date2,port1,port2,....some amount of port
word2,date3,date4,
....

我想要的是迭代每一行(我想我会用简单的for循环来做)并获得所有端口。 我想我需要的是在两个日期之后获取所有东西并寻找 ,(\d+),?和回来的小组

我的问题是:

1)可以用一个表达式完成吗? (意思是,不将结果存储在字符串中,然后应用另一个正则表达式)

2)我可以将迭代结合到正则表达式中吗?

2 个答案:

答案 0 :(得分:3)

有很多方法可以做到这一点,我将展示一些用于教育目的。

我将您的输入放在String仅作为示例,您必须正确阅读。我还将结果存储在List中并在最后打印出来:

public static void main(String[] args) {

    String source = "col1,col2,clo3,col4" + System.lineSeparator() +  
            "word1,date1,date2,port1,port2,port3" + System.lineSeparator() +  
            "word2,date3,date4";
    List<String> ports = new ArrayList<>();

    // insert code blocks bellow

    System.out.println(ports);
}
  • 使用Scanner

    Scanner scanner = new Scanner(source);
    scanner.useDelimiter("\\s|,");
    while (scanner.hasNext()) {
        String token = scanner.next();
        if (token.startsWith("port"))
            ports.add(token);
    }
    
  • 使用String.split

    String[] values = source.split("\\s|,");
    for (String value : values) {
        if (value.startsWith("port"))
            ports.add(value);
    }
    
  • 使用Pattern - Matcher

    Matcher matcher = Pattern.compile("(port\\d+)").matcher(source);
    while (matcher.find()) {
        ports.add(matcher.group());
    }
    

输出:

[port1, port2, port3]

如果你知道&#34; ports&#34;如果位于文件中,您可以使用该信息通过指定位置和获取子字符串来略微提高性能。

答案 1 :(得分:2)

是的,它可以在一行中完成:

  • 首先删除所有非端口术语(包含非数字的术语)
  • 然后在逗号
  • 上拆分第一步的结果

这是神奇的界限:

PD.orgs.FirstOrDefault(o => o.orgname == selectedOrgName)

正则表达式说“任何具有非数字的术语”,其中“术语”是输入开始/逗号和逗号/输入结束之间的一系列字符。

方便地,String[] ports = line.replaceAll("(^|(?<=,))[^,]*[^,\\d][^,]*(,|$)", "").split(","); 方法不会返回尾随空白术语,因此无需担心第一次替换后留下的任何尾随逗号。

在java 8中,你可以在一行中完成它,但事情要简单得多:

split()

这会对逗号分割的结果进行流式处理,然后过滤掉非全数字元素,它们会收集结果。

一些测试代码:

List<String> ports = Arrays.stream(line.split(",")).filter(s -> s.matches("\\d+")).collect(Collectors.toList());

输出:

String line = "foo,12-12-12,11111,2222,bar,3333";
String[] ports = line.replaceAll("(^|(?<=,))[^,]*[^,\\d][^,]*(,|$)", "").split(",");
System.out.println(Arrays.toString(ports));

java 8中的相同输出:

[11111, 2222, 3333]