在空格处分割字符串

5

我目前正在尝试将一个字符串拼接到多行字符串中。 正则表达式应选择在之前有13个字符的空格。

问题是,13个字符计数在先前选择的空格后不会重置。 因此,在第一个13个字符之后,正则表达式选择每个空格。

我正在使用以下具有13个字符的正向后查找的正则表达式:

(?<=.{13}) 

您可以在这里测试正则表达式以及以下代码:

import java.util.ArrayList;
public class HelloWorld{

     public static void main(String []args){
        String str = "This is a test. The app should break this string in substring on whitespaces after 13 characters";

        for (String string : str.split("(?<=.{13}) ")) {
            System.out.println(string);
        }
     }
}

这段代码的输出如下:

这是一个测试。
应用程序
应该在
字符串中断开
在空格后的子字符串上
在13个字符后

但应该是这样的:

这是一个测试。
应用程序应该
在字符串中断开
在空格后的子字符串上
在13个字符后

3个回答

5

您可以使用惰性限制量词来匹配行,然后使用$0\n进行替换:

.{13,}?[ ]

请查看正则表达式演示
IDEONE演示中:
String str = "This is a test. The app should break this string in substring on whitespaces after 13 characters"; 
System.out.println(str.replaceAll(".{13,}?[ ]", "$0\n"));

请注意,该模式匹配:
- .{13,}? - 任何非换行符的字符(如果需要匹配任何字符,请使用DOTALL修饰符,但我怀疑在当前情况下不需要),至少13次,并且它可以匹配更多的字符,但只能匹配到第一个遇到的空格。 - [ ] - 一个字面上的空格(字符类是多余的,但它有助于可视化模式)。
替换模式 - "$0\n" - 重新插入整个匹配的值(它存储在Group 0中)并在其后添加一个换行符。

哦,谢谢。我没有想到要匹配字符串并像这样使用匹配组。当我想选择它们时,我总是很难处理匹配组。我删除了我的先前评论,因为我读你的答案太快了。 - Seblor
好的,我认为你没有想到整个匹配值可以在替换模式中使用 $0 进行反向引用。 - Wiktor Stribiżew
没错。我通常只使用正则表达式来匹配电子邮件地址、数字等内容...(而且不是用Java)。 - Seblor
顺便问一下,我真的需要在空格周围使用括号吗? - Seblor
1
正如我之前提到的,不需要这样做。在Java中,即使选择了注释模式((?x)),字符类内部的空格也会被忽略,因此这样做并没有太多意义。我只是添加了它们以突出空格。 - Wiktor Stribiżew

3

您可以匹配并捕获空格之前的13个字符,而不是拆分字符串。

Java代码:

Pattern p = Pattern.compile( "(.{13}) +" );
Matcher m = p.matcher( text );

List<String> matches = new ArrayList<>();
while(m.find()) {
    matches.add(m.group(1));
}

它将产生:
This is a test.
The app should
break this string
in substring on
whitespaces after
13 characters 

正则表达式演示


谢谢您的回答,但Wiktor的答案更简短,不需要Pattern或Matcher对象。无论如何,感谢您向我展示了Matcher.group()方法。 - Seblor
split 方法的返回值是一个字符串数组,而不是带有 \n 的字符串。为了获得一个数组,需要编写额外的代码。如果原始字符串已经包含了 \n,那么如何区分原始的 \n 和新插入的 \n 呢? - anubhava

0
你可以使用.split方法和正则表达式来实现这个功能。代码如下:
line.split("\\s+"); 

这将使用一个或多个空格来分割每个单词。


1
我认为你需要重新阅读问题。(而且我已经得到了答案) - Seblor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接