问题陈述
给定一个字符串s,匹配正则表达式[A-Za-z!,?。_'@] +,将字符串拆分为标记。我们将令牌定义为一个或多个连续的英文字母。然后,打印令牌的数量,然后在新行上打印每个令牌。
输入格式
单个字符串,s。 s由英文字母,空格和以下任何字符组成:!,?。_'@
输出格式
在第一行,打印一个整数n,表示字符串s中的标记数(它们不需要是唯一的)。接下来,以与输入字符串s中出现的顺序相同的顺序在新行上打印n个标记中的每一个。
示例输入
他是一个非常好的男孩,不是吗?
示例输出
10
他
是
一
非常
非常
好
男孩
ISN
吨
他
我的代码:
import java.io.*;
import java.util.*;
import java.util.regex.*;
public class Solution {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
scan.close();
String[] splitString = (s.replaceAll("^[\\W+\\s+]", "").split("[\\s!,?._'@]+"));
System.out.println(splitString.length);
for (String string : splitString) {
System.out.println(string);
}
}
}
此代码适用于示例输入但不通过此测试用例。
测试案例
输入:
YES leading spaces are valid, problemsetters are evillllll
预期输出:
8
YES
导致
空间
是
有效
problemsetters
是
evillllll
代码中的哪些更改会通过此测试用例?
答案 0 :(得分:1)
谈到在字符串的开头修剪非单词字符,你的正则表达式是不正确的。
^[\\W+\\s+]
匹配字符串开头的1个字符,非字(\W
),+
或空格。使用replaceAll
没有任何意义,因为字符串开头只有1个字符将匹配。此外,\W
实际上也匹配空白字符,因此不需要将\s
包含在\W
的同一个字符类中。
您可以将.replaceAll("^[\\W+\\s+]", "")
替换为.replaceFirst("^\\W+", "")
。这将删除字符串开头的1个或多个非单词字符(请参阅this regex demo)。
请参阅this online Java demo,以获得预期的输出。
答案 1 :(得分:1)
试试这个就行了
import java.io.*;
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
scan.close();
s = s.trim();
if (s.length() == 0) {
System.out.println(0);
} else {
String[] strings = s.split("['!?,._@ ]+");
System.out.println(strings.length);
for (String str : strings)
System.out.println(str);
}
}
}
答案 2 :(得分:1)
您可以在拆分字符串之前对其进行修剪。在给定的测试用例中,它也会计算字符串开头的空格。试试这个:
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine().trim();
if(s.isEmpty())
System.out.println("0");
else {
String[] S = s.split("[\\s!,?._'@]+");
System.out.println(S.length);
for(int i=0;i<S.length;i++) {
System.out.println(S[i]);
}
}
scan.close();
}
}
答案 3 :(得分:0)
if(s.trim().isEmpty()){
System.out.println("0");
System.out.println(s);
} else {
String[] splitString = (s.replaceAll("^\\W+", "").split("[\\s!,?._'@]+"));
System.out.println(splitString.length);
for(String str: splitString) {
System.out.println(str);
}
}
答案 4 :(得分:0)
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
StringTokenizer st = new StringTokenizer(s,("[_\\@!?.', ]"));
System.out.println(st.countTokens());
while(st.hasMoreTokens()){
System.out.println(st.nextToken());
}
scan.close();
}
答案 5 :(得分:0)
import java.io.*;
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
String[] arr = s.split("\\s+|\\,+|\\'+|[\\-\\+\\$\\?\\.@&].*");
// Write your code here.
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
scan.close();
}
}
答案 6 :(得分:0)
以下内容应有所帮助
public static void regexTest() {
String s="isn't he a good boy?";
// Replace any non alphabetic characters with a space.
// [^a-zA-Z]
// [ - Start a custom character class
// ^ - Anything that is not
// a-zA-Z - a lowercase character or upper case character.
// for example a-z means everything starting from 'a' up to
// and including 'z'
// ] - End the custom character class.
// Given the input string, the single quote and question mark will be replaced
// by a space character.
s=s.replaceAll("[^a-zA-Z]", " ");
// Split the string (that only contains letters and spaces into individual words.
String[] array_s=s.split(" ");
for(int i=0;i<array_s.length;i++) {
System.out.println(array_s[i]);
}
答案 7 :(得分:0)
这将通过所有测试用例
import java.io.*;
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
if(s.trim().isEmpty()) {
System.out.println(0);
}
else {
System.out.println(s.trim().split("[!,?. @_']+").length);
for(String a : s.trim().split("[!,?. @_']+")){
System.out.println(a);
}
}
scan.close();
}
}