当前位置: 首页 > 面试题库 >

将Java中的字符串拆分为等长的子字符串,同时保持单词边界

弘承运
2023-03-14
问题内容

如何在保持单词边界的同时将字符串分成最大字符长度的相等部分?

例如,如果我想将字符串“ hello world”分割为最多7个字符的相等子字符串,则应该返回我

"hello "

"world"

但是我当前的实现返回

"hello w"

"orld   "

我正在使用以下从Java中的Splitstring拆分为等长子字符串的代码,将输入字符串拆分为相等的部分

public static List<String> splitEqually(String text, int size) {
    // Give the list the right capacity to start with. You could use an array
    // instead if you wanted.
    List<String> ret = new ArrayList<String>((text.length() + size - 1) / size);

    for (int start = 0; start < text.length(); start += size) {
        ret.add(text.substring(start, Math.min(text.length(), start + size)));
    }
    return ret;
}

将字符串拆分为子字符串时,是否可以保持单词边界?

更具体地说,我需要字符串拆分算法来考虑空格提供的单词边界,而不是仅在拆分字符串时依赖于字符长度,尽管这也需要考虑,但更像是字符的最大范围而不是硬编码的字符长度。


问题答案:

如果我正确理解了您的问题,那么这段代码应该可以满足您的要求(但是它假定 maxLenght 等于或大于最长字

String data = "Hello there, my name is not importnant right now."
        + " I am just simple sentecne used to test few things.";
int maxLenght = 10;
Pattern p = Pattern.compile("\\G\\s*(.{1,"+maxLenght+"})(?=\\s|$)", Pattern.DOTALL);
Matcher m = p.matcher(data);
while (m.find())
    System.out.println(m.group(1));

输出:

Hello
there, my
name is
not
importnant
right now.
I am just
simple
sentecne
used to
test few
things.

"\\G\\s*(.{1,"+maxLenght+"})(?=\\s|$)"正则表达式的简短说明:

(请记住,Java
\不仅在正则表达式中很特殊,而且在字符串文字中也是如此,因此要使用预定义的字符集,就像\d我们需要编写它那样,"\\d"因为我们也需要\在字符串文字中对其进行转义)

  • \G-是表示先前建立的匹配项结尾的锚点,还是表示尚无匹配项(当我们刚开始搜索时)字符串开头(与之相同^
  • \s*-代表零个或多个空格(\s代表空格,*“零个或多个”量词)
  • (.{1,"+maxLenght+"})-让我们将其拆分为更多部分(在运行时:maxLenght将保留一些数值,如10,因此regex会将其视为.{1,10}
    • .代表任何字符(实际上默认情况下它可以代表除行分隔符(如\n或)之外的任何字符\r,但是由于有了Pattern.DOTALL标志,它现在可以代表任何字符- 如果要开始分别分割每个句子,则可以摆脱此方法参数,因为它的开始将无论如何都要换行
    • {1,10} -这是一个量词,它使前面描述的元素出现1到10次(默认情况下会尝试查找匹配重复的最大数量),
    • .{1,10} -因此,根据我们刚才所说的,它只代表“ 1到10个字符”
    • ( )-括号创建组,结构,使我们能够保存匹配的特定部分(此处添加括号后\\s*是因为我们只想在空格后使用部分)
  • (?=\\s|$)-是一种超前机制,可确保匹配的文本.{1,10}后面有:

    • 空格(\\s

或(写为|

* 字符串末尾`$`。

因此,由于.{1,10}我们最多可以匹配10个字符。但是有了(?=\\s|$)它之后,我们要求与匹配的最后一个字符.{1,10}不属于未完成的单词的一部分(后面必须有空格或字符串的结尾)。



 类似资料:
  • 问题内容: 如何在Java 中将字符串拆分为相等大小的子字符串。例如。大小相等的4个应该给出输出。 问题答案: 这是regex一线版: 是一个零宽度断言,它与上一个匹配结束的位置匹配。如果是以前没有的比赛,它的输入的开始,同相匹配。后面的封闭式匹配从最后一场比赛的末尾开始算起的四个字符的位置。 都是落后的,都是高级正则表达式功能,并非所有版本都支持。此外,在支持它的所有口味上实现的方式不一致。此技

  • 问题内容: 有没有办法在不知道字符串长度的情况下,将一个字符长的字符串切成4个字符串,每个字符长? 例如: 问题答案:

  • 问题内容: 我想做的是一项相当普通的任务,但我在网络上找不到任何参考。我的文字带有标点符号,我想要一个单词列表。 应该 但是只能使用一个参数,因此在用空格分割后,所有单词都带有标点符号。有任何想法吗? 问题答案: 正则表达式合理的情况:

  • 问题内容: 我需要将一个String拆分为单个字符String的数组。 例如,拆分“ cat”将得到数组“ c”,“ a”,“ t” 问题答案: 这将产生

  • 问题内容: 如何将以下单词拆分为数组 进入 我尝试过这样的事情 但是输出是 问题答案: 要在空格和撇号上进行特殊分割: 或分割成任何非文字字符:

  • 问题内容: 我已经编写了这段代码,用于拆分字符串并将其存储在字符串数组中:- 但是,我添加了[az],因为我想处理一些缩写问题。但是随后我的结果显示为: 此外,当埃弗里特(Everett)试图指导他们进行基础数学训练时,他们被证明是毫无反应的 我看到丢失了split函数中指定的模式。对我来说,可以省略句号,但是丢失单词的最后一个字母会打乱其含义。 有人可以帮助我吗?此外,有人可以帮助我解决缩写吗?