有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我不熟悉Java,尤其是regex 我有一个CSV文件,看起来像:

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

我想要的是迭代每一行(我想我将使用SimpleFor循环来完成),然后返回所有端口。 我想我需要的是在两次约会之后把所有的东西都拿出来找 ,(\d+),?和返回的组

我的问题是:

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

2)我可以将行上的迭代合并到正则表达式中吗


共 (2) 个答案

  1. # 1 楼答案

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

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

    这是一条神奇的线:

    String[] ports = line.replaceAll("(^|(?<=,))[^,]*[^,\\d][^,]*(,|$)", "").split(",");
    

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

    方便的是,split()方法不返回尾随的空白项,因此不需要担心第一次替换后留下的任何尾随逗号

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

    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));
    

    输出:

    [11111, 2222, 3333]
    

    java 8中的相同输出用于:

    String line = "foo,12-12-12,11111,2222,bar,3333,baz";
    List<String> ports = Arrays.stream(line.split(",")).filter(s -> s.matches("\\d+")).collect(Collectors.toList());
    
  2. # 2 楼答案

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

    我把你的输入放在一个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]
    

    如果知道“端口”在文件中的位置,可以使用该信息通过指定位置和获取子字符串来略微提高性能