如何将字符串(通过匹配一组正则表达式)拆分为标记并在JAVA中打印每个标记?

时间:2016-09-29 12:16:44

标签: java regex string

问题陈述

给定一个字符串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

代码中的哪些更改会通过此测试用例?

8 个答案:

答案 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();
    }
}