【问题标题】:Split a string within an array list each time a character is encountered每次遇到字符时拆分数组列表中的字符串
【发布时间】:2013-10-16 18:09:33
【问题描述】:

我正在尝试将字符串分解为由文本行组成的数组列表。每 90 个字符或遇到换行符 (\r) 时创建一行。

我使用它来将字符串分成每 90 个字符的数组(代码中的partionSize):

    private static List<String> getParts(String string, int partitionSize) {
    List<String> parts = new ArrayList<String>();
    int len = string.length();
    for (int i=0; i<len; i+=partitionSize)
    {
        parts.add(string.substring(i, Math.min(len, i + partitionSize)));
    }
    return parts;
    }

如何修改它,以便它检查换行符 ("\r") 并在每次检测到一个时拆分,以及每 90 个字符拆分一次?

__

更新:

使用下面提供的正则表达式解决方案,如下所示:

String[] parts = string.split("(?<=\\G.{" + partitionSize + "})|\r|\n"); 

我输入了一个分多行的字符串,例如:

 1. 
 2. 
 3. 
 4.
 5. 

当我使用下面的正则表达式将其拆分为 array[] 部分时,parts.length 为 8,并且在部分中打印每个项目会返回:

line 0 is 1. 
line 1 is 
line 2 is 2. 
line 3 is 
line 4 is 3.
line 5 is 
line 6 is 4.
line 7 is 
line 8 is 5.

对于这种情况,parts.length 应该是 5。

【问题讨论】:

  • 我认为您不会为您的字符串获得该输出。请再次检查。它为我提供了该字符串所需的输出。
  • 如果我这样做,那么它可以工作: String[] parts = string.split("(?
  • 行分隔符因操作系统而异。在 Unix 上是 \n,在 Windows 上是 \r\n,在 MAC 上是 \r
  • 有趣。对于 Java Web 应用程序,其中 string 是用户输入的文本,是用户的操作系统还是应用程序运行的系统?

标签: java regex arrays string


【解决方案1】:

您可以使用以下正则表达式进行拆分:

String[] arr = str.split("(?<=\\G.{90})|[\r\n]|\r\n");
  • (?&lt;=\\G.{90}) 从前一个匹配项开始拆分前面有 90 个字符的空字符串。 \\G 锚使正则表达式从前一个匹配结束的地方开始匹配。因此,它首先匹配开头的 90 字符,然后匹配下一个 90 字符,依此类推。
  • [\r\n] 拆分为 \r\n
  • \r\n\r\n 上拆分,这是 Windows 上的行分隔符。

演示代码:

String str = "abcdefghi\njkl\rmnopasdf";            
int maxCharacters = 5;

String[] arr = str.split("(?<=\\G.{" + maxCharacters + "})|[\r\n]|\r\n");       
System.out.println(Arrays.toString(arr));

输出:

[abcde, fghi, jkl, mnopa, sdf]

参考资料:

【讨论】:

  • 我可以在那个正则表达式中使用一个变量,即代替 {90}、{MAX_NUMBER_OF_LINES} 左右吗?
  • @Ali 是的,你可以。只需使用字符串连接来构建正则表达式。
  • 我从这个正则表达式中得到了一个奇怪的结果。如果我循环遍历并分部分打印出每个项目,我会为每个换行符获得一个额外的拆分。例如,如果我输入一个字符串“1. 2. 3. 4.”,每一个都在单独的行上,输出显示 item 1 = “1.” item 2 = “” item 3 = “2.” item 4 = ““ 等等。你认为这与我的字符串的格式有关吗?
  • @Ali 很难在 cmets 中可视化您的字符串。而是将其添加到您的问题中。
【解决方案2】:

我会调用string.split("\r") 在换行符处创建一个字符串拆分数组。然后遍历每一个,如果长度超过 90 个字符,则在该点拆分它。

【讨论】:

  • 您必须在每次拆分 90 个字符时动态地使数组更大
  • 非常正确。上面涉及正则表达式的答案是一个更好的解决方案。
猜你喜欢
  • 2017-09-25
  • 1970-01-01
  • 2016-04-14
  • 2020-08-11
  • 2020-02-12
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多