【问题标题】:Regex to split String on pattern but with a minimum number of characters正则表达式在模式上拆分字符串,但字符数最少
【发布时间】:2018-11-07 21:08:42
【问题描述】:

我想按照这些规则拆分存储在字符串变量中的长文本:

  1. 在一个点 (.) 上分割
  2. 子字符串的最小长度应为 30(例如)。

举个例子:

"The boy ate the apple. The sun is shining high in the sky. The answer to life the universe and everything is forty two, said the big computer."

假设我想要的最小长度是 30。

得到的结果拆分为:

  • “男孩吃了苹果。太阳高高挂在天空。”
  • “关于生命宇宙和万物的答案是四十二,大型计算机说。”

我不想听“那个男孩吃了苹果”。作为一个拆分,因为它少于 30 个字符。

我想到的两种方式:

  1. 遍历所有字符并将它们添加到字符串构建器。每当我到达一个点 (.) 时,我都会检查我的 String builder 是否超过了我拆分它的最小值,否则我继续。
  2. 在所有点 (.) 上分割,然后循环分割。如果拆分字符串之一小于最小值,我将其与后面的字符串连接。

但我正在寻找这是否可以通过使用正则表达式直接在匹配前拆分和测试最少字符数来完成。

谢谢

【问题讨论】:

    标签: java regex string split


    【解决方案1】:

    您也可以使用捕获组来匹配您的值,而不是使用拆分。 要使点也匹配换行符,您可以使用Pattern.DOTALL

    \s*(.{30}[^.]*\.|.+$)
    

    在 Java 中:

    String regex = "\\s*(.{30}[^.]*\\.|.+$)";
    

    说明

    • \s* 匹配 0_ 次空白字符
    • (抓包组
      • .{30} 匹配任意字符 30 次
      • [^.]* 使用否定字符类匹配 0+ 次而不是点
      • \. 字面匹配
      • |或者
      • .+$ 匹配任意字符 1+ 次,直到字符串结尾。
    • )关闭捕获组

    Regex demo | Java demo

    【讨论】:

    • 您好,我喜欢这种方法,但如果最后一部分少于 30 个字符,则会丢失。是否可以对其进行修改以匹配最后剩余的部分(在您的 java 代码示例中,最后一个“测试”被省略。通过正则表达式或 java 代码执行此操作对我有用。谢谢
    • @Youssef 如果您的意思是要匹配后面没有点的内容,您可以使用交替。 \s*(.{30}[^.]*\.|[^.]+$) Regex Demo | Java demo
    • 我想匹配最后一部分,不管它是什么。如果该演示在末尾将匹配“测试”,但不会匹配“测试”。 (如果末尾有一个点但少于 30 个字符)。我尽量不丢失文本的最后一句话。如果这有意义
    • @Youssef 在这种情况下,您可以将正则表达式更改为 \s*(.{30}[^.]*\.|.+$) Demo。这将匹配 30 个字符,直到第一个点,否则它将匹配所有字符。
    • 确实如此。谢谢!
    【解决方案2】:

    不要使用 split 方法,而是尝试使用以下正则表达式 matching\S.{29,}?[.]

    Demo

    【讨论】:

      【解决方案3】:

      这应该可以完成工作:

      "\W*+(.{30,}?)\W*\."
      

      测试:https://regex101.com/r/aavcme/3

      • \W*+ 需要尽可能多的非单词字符来修剪句子之间的空格
      • . 匹配任何字符(我猜你想匹配句子中的任何字符)
      • {30,} 断言匹配的最小长度 (30)
      • ? 表示“尽可能少”
      • \. 匹配分隔句子的点(假设您总是在句子末尾有一个点,即使是最后一个)

      【讨论】:

      • 此解决方案有效,但如果最后一部分长度少于 30 个字符,您必须手动提取。
      • 这个怎么样? ((.{30,}?\.)+)(.+)?
      • 你把所有的句子都用那个合并了……刚刚在 regex101 上测试过
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多