Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 文本在指定长度后拆分,但不使用grails打断单词_Java_Regex_Groovy - Fatal编程技术网

Java 文本在指定长度后拆分,但不使用grails打断单词

Java 文本在指定长度后拆分,但不使用grails打断单词,java,regex,groovy,Java,Regex,Groovy,我有一个长字符串,需要将其解析为长度不超过50个字符的字符串数组。对我来说,最棘手的部分是确保正则表达式找到50个字符之前的最后一个空格,以便在字符串之间完全分开,因为我不希望单词被截断 public List<String> splitInfoText(String msg) { int MAX_WIDTH = 50; def line = [] String[] words; msg = msg.trim(); words = ms

我有一个长字符串,需要将其解析为长度不超过50个字符的字符串数组。对我来说,最棘手的部分是确保正则表达式找到50个字符之前的最后一个空格,以便在字符串之间完全分开,因为我不希望单词被截断

public List<String> splitInfoText(String msg) { 
     int MAX_WIDTH = 50; 
     def line = [] String[] words; 
     msg = msg.trim(); 
     words = msg.split(" "); 
     StringBuffer s = new StringBuffer(); 
     words.each {
        word -> s.append(word + " "); 
        if (s.length() > MAX_WIDTH) { 
          s.replace(s.length() - word.length()-1, s.length(), " "); 
          line << s.toString().trim();
          s = new StringBuffer(word + " "); 
        } 
     } 
     if (s.length() > 0) 
        line << s.toString().trim();
     return line; 
}
公共列表拆分信息文本(字符串msg){
int MAX_WIDTH=50;
def行=[]字符串[]个字;
msg=msg.trim();
words=msg.split(“”);
StringBuffer s=新的StringBuffer();
每个字{
word->s.append(word+“”);
如果(s.length()>MAX_WIDTH){
s、 替换(s.length()-word.length()-1,s.length(),“”);
第0行)
行试试这个:

List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile(".{1,50}(?:\\s|$)", Pattern.DOTALL);
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    matchList.add(regexMatcher.group());
}
List matchList=new ArrayList();
Pattern regex=Pattern.compile(“.{1,50}(?:\\s |$)”,Pattern.DOTALL);
Matcher regexMatcher=regex.Matcher(subjectString);
while(regexMatcher.find()){
add(regexMatcher.group());
}

我认为蒂姆的答案有一个更好的版本:

List matchList = ( subjectString =~ /(?s)(.{1,50})(?:\s|$)/ ).collect { it[ 1 ] }

提供您的输入和预期输出?公共列表splitInfoText(String msg){int MAX_WIDTH=50;def line=[]String[]word;msg=msg.trim();word=msg.split(“”);StringBuffer s=new StringBuffer();word.each{word->s.append(word+“”);if(s.length()>MAX_WIDTH){s.replace(s.length()-word.length()-1,s.length(),“”);第0行)第@Nimmy行:我试图将您的代码放在问题的主体中,但如果您自己编辑问题并输入代码,效果会更好。如果您提供输入和预期输出,而不是Groovy代码,效果会更好。@JRSofty:我忘了初始化
匹配列表
参数-是否有效现在?如果没有,到底是什么问题?现在它工作了。原版捕获了空格,但除了一个单词之外没有捕获文本。这正如我所期望的那样工作。我一点也不懂Groovy,但这在我看来确实非常Groovy。+1:)