[英]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.