繁体   English   中英

正则表达式拆分导致额外的空间,使用 \\s 但没有摆脱它

[英]Regex splitting resulting in an extra space, using \\s but not getting rid of it

我正在尝试使用正则表达式解析字符串,该字符串具有开头括号和结尾括号,在它们之间列出了小英文字母,用逗号分隔。 每个逗号后跟一个空格。 像这样

import java.util.Arrays;
import java.util.Set;
import java.util.HashSet;
import java.io.*;

public class StringLetters {

    public static void main(String[] args) {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String[] temp = br.readLine().split("\\s*(\\{|,|\\}|\\s)\\s*");

            for (int i = 0; i < temp.length; i++) {
                System.out.println("temp[" + i + "] ===>" + temp[i]);
            }

            Set<String> set = new HashSet<>();
            for (String a : temp) {
                set.add(a);
            }

            System.out.println(set.size());
        } catch (IOException ioe) {

        }
    }
}

当我将 {a, b, c} 作为输入传递时

$ java StringLetters

  {a, b, c}

 temp[0] ===>
 temp[1] ===>a
 temp[2] ===>b
 temp[3] ===>c
 4

其他输入可以是 {}, {s, h, a, n, o, n, o}, {h, e, a, l, h, t}...等

所以当我在做

   $ java StringLetters
    {}
    0

这是正确的,对于空字符串,我应该得到这个 0。

临时数组中第 0 位的空字符串不是我想要的,要摆脱我在 '(\{|,|\}|\s)' 中使用 \s 的情况,但这对我没有帮助!!

如果您只需要输入中的单个字母,我会使用与拆分不同的方法 go 。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) throws ParseException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        Pattern pattern = Pattern.compile("\\p{Alpha}");
        Matcher matcher = pattern.matcher(br.readLine());

        Set<String> set = new HashSet<>();

        while (matcher.find()) {
            System.out.println(matcher.group());
            set.add(matcher.group());
        }

        System.out.println(set.size());
    }
}

示例运行:

{a, b, c}
a
b
c
3

另一个示例运行:

{}
0

注意: \p{Alpha}代表单个字母,可以替换为[A-Za-Z] 在此处了解有关这些模式的更多信息。 您还想查看Java 正则表达式教程

如果你想坚持自己的方式(即拆分字符串),你可以这样做:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.util.HashSet;
import java.util.Set;

public class Main {
    public static void main(String[] args) throws ParseException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] temp = br.readLine().split("\\s*(\\{|,|\\}|\\s)\\s*");

        for (int i = 1; i < temp.length; i++) {// Start with index 1
            System.out.println("temp[" + i + "] ===>" + temp[i]);
        }

        Set<String> set = new HashSet<>();
        for (String a : temp) {
            if (!a.isBlank() && !a.isEmpty()) {// Check if the string is not empty or blank
                set.add(a);
            }
        }

        System.out.println(set.size());
    }
}

示例运行:

{a, b, c}
temp[1] ===>a
temp[2] ===>b
temp[3] ===>c
3

我在代码中添加了注释,以便您更容易注意到更改。 需要这些更改的原因是String#split返回一个最小大小为1的数组,例如System.out.println("Hello".split("$").length)将打印1

正则表达式将 { 作为第一个分隔符,给你一个空字符串。 简单的方法是在创建Set时过滤数组:

        Set<String> set = new HashSet<>(); 
        for(String a : temp){
            if (a != null && !a.isEmpty())
               set.add(a);
        }

在不调用拆分的情况下,上述任务可以按如下方式完成:-

import java.util.Set;
import java.util.HashSet;
import java.io.*;

public class StringLetters {
  
    public static void main(String[] args){
      
        try{
           
          BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
          String str = br.readLine();
          Set<Character> set = new HashSet<>();
          for(int i = 0; i < str.length(); i++){
            
              if(str.charAt(i) != '{' && str.charAt(i) != '}' && str.charAt(i) != ' ' && str.charAt(i) != ','){
                 
                 set.add(str.charAt(i));

              }
          }

          System.out.println(set.size());
        
        }catch(IOException ioe){
          ioe.printStackTrace();
        }
    }
}

任务本身很简单,但我对正则表达式很感兴趣,想知道如何使用正则表达式来完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM