我正在使用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"
答案 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="";
}
}