如何使用正则表达式和拆分将字符串分成n个单词分组的部分?

时间:2018-07-21 20:27:50

标签: java regex split

我正在使用a窃检测软件的一部分,需要使用regex和split方法将字符串分成单词的子组。

假设我们有以下字符串,并希望将其分成三个单词。在这种情况下,split(regex)应该在每个第三个空格之后分割句子。

示例数据"It is a long established fact that"
示例输出"It is a", "long established fact"

这是代码的简化版本,包括我正在研究的部分。我每隔两个字就进行了拆分,但是在n = 3时无法做到。

public class String {
    public void Splitter(String string){
    //string:"It is a long established fact that"
    String[] splitString =string.split("(?<!\\G\\S+)\\s");
    }
}

以上代码的输出如下:

splitString[0] = "It is"
splitString[1] = "a long"
splitString[2] = "established fact"

然后我想出这个正则表达式(?<=\\G\\s{2})\\s“如果前面还有其他两个空格,则匹配每个空格。”并期望输出为"It is a", "long established fact",但数组为空。

这是我刚刚构建的另一个正则表达式:("(?<=(^|\\G)\\S*\\s\\S*\\s\\S*)\\s")它几乎可以完成工作。唯一的问题是,如果句子中的单词总数不能被n整除,splitString[3] = "that"

则最后一组单词可以少于n个单词

2 个答案:

答案 0 :(得分:1)

您不能使用split函数,split方法将字符串拆分为给定正则表达式的匹配项,并且您没有de分隔符的条件,您有betewn de分隔符“ \ S”的条件\ s + \ S \ s + \ S”,您的错是错。

如果您需要使用正则表达式,请使用 Pattern Matcher 类。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public static void main(String[] args) {
    // TODO Auto-generated method stub
     Pattern p = Pattern.compile("\\S+\\s+\\S+\\s+\\S+\\s*|\\S+\\s*$|\\S+\\s+\\S+\\s*$");
     Matcher m = p.matcher("It is a long established fact that");
     String palabras=null;
     do {
        try {
            m.find(); 
            palabras = m.group();
            System.out.println(palabras);
        } catch(IllegalStateException E) {
            break;
        }
     } while(null != palabras && "" != palabras);
}

输出:

It is a 
long established fact
that

一个通用的正则表达式,其中“ n”个单词的路径相同,其中3是您的n,2是您的n-1。

"(\\S+\\s+){3}\\s*|(\\S+\\s*){1,2}$"

替换之前的代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTestPalabra {

    public static void main(String[] args) {
         int n = 3;
         String regexPat = String.format("(\\S+\\s+){%d}\\s*|(\\S+\\s*){1,%d}$", n,n-1);

         Pattern p = Pattern.compile(regexPat);
         Matcher m = p.matcher("It is a long established fact that is ");
         String palabras=null;
         do{
            try{
            m.find(); 
            palabras = m.group();
            System.out.println(palabras);
            }catch(IllegalStateException E){
                break;
            }
         }while(null != palabras && "" != palabras);

    }

}

答案 1 :(得分:0)

根据需要进行更改。这只是一个示例,您如何将String语句分解为单独的单词,这些单词将存储在ArrayList中。

import java.util.ArrayList;
import java.util.List;

public class Main {
private static String word="";
private static int readerStoppedAt=0;
private static int h;
private static List<String> strings = new ArrayList<>();

public static void main(String[] args) {
      String text;

    //try one of those Strings:
    //text="Hello there, it's just a casual test!";
    //text="It works!!%%%!!||#@|''#'@ Symbols are not a problem";
    text="Good game, well played! Future changes are not necessary!";

    String text2=removeSymbols(text);
    for(int i=0; i<text2.length();i++){
        h=i; //h=where main cycle is currently at
        char c=text2.charAt(i);
        String str=c+"";
        if(str.equals(" ")){
            check(text2, 0);
        }else if(i+1==text2.length()){
            check(text2, 1);
        }
    }
    for (String string : strings) {
        System.out.println(string);
    }
}

private static String removeSymbols(String text) {
    //You can add some symbols if you want
   text=text.replace("!","");
   text=text.replace(",","");
   text=text.replace("@","");
   text=text.replace("#","");
   text=text.replace("|","");
   text=text.replace("''","");
   text=text.replace("'","");
   text=text.replace("%","");
    text=text.replace(":","");
    text=text.replace("(","");
    text=text.replace(")","");
    text=text.replace("{","");
    text=text.replace("}","");
    return text;
}

private static void check(String text, int inc) {
    for(int j=readerStoppedAt;j<h+inc;j++){
        char temp = text.charAt(j);
        String tempStr= temp +"";
        if(!tempStr.equals(" ")){
            word=word+ temp;
        }
    }
    readerStoppedAt=h;
    strings.add(word);
    word="";
}

}