繁体   English   中英

Java - 使用最小大小和分隔符分割标记的正则表达式

[英]Java - Regex to Split Tokens With Minimum Size and Delimiters

我知道我知道,有很多类似的问题,我可以说我读了所有这些问题。 但是,我对正则表达式并不擅长,我无法弄清楚我需要的正则表达式。

我想在Java中拆分一个String,我有4个约束:

  1. 分隔符是[。?!](句末)
  2. 十进制数不应该被标记化
  3. 不应删除分隔符。
  4. 每个令牌的最小大小应为5

例如,输入:

"Hello World! This answer worth $1.45 in US dollar. Thank you."

输出将是:

[Hello World!, This answer worth $1.45 in US dollar., Thank you.]

到目前为止,我得到了这个正则表达式的三个第一个约束的答案:

text.split("(?<=[.!?])(?<!\\d)(?!\\d)");

而且我知道我应该在我的正则表达式中使用{5,} ,但我试过的任何组合都不起作用。

对于以下情况: "I love US How about you?" 如果它给我一个或两个句子并不重要,只要它不将S.标记为单独的句子。

最后,介绍一个很好的正则表达式教程是值得赞赏的。

更新:正如克里斯在评论中提到的那样,几乎不可能用正则表达式来解决这样的问题(用自然语言覆盖所有情况)。 然而,我发现HamZa的答案是壁橱,也是最有用的。

所以,小心! 接受的答案不会涵盖所有可能的用例!

下一个正则表达式怎么样?

(?<=[.!?])(?!\w{1,5})(?<!\d)(?!\d)

例如

private static final Pattern REGEX_PATTERN = 
        Pattern.compile("(?<=[.!?])(?!\\w{1,5})(?<!\\d)(?!\\d)");

public static void main(String[] args) {
    String input = "Hello World! This answer worth $1.45 in U.S. dollar. Thank you.";

    System.out.println(java.util.Arrays.toString(
        REGEX_PATTERN.split(input)
    )); // prints "[Hello World!,  This answer worth $1.45 in U.S.,  dollar.,  Thank you.]"
}

根据之前制作的正则表达式得出答案。
正则表达式基本上是(?<=[.?!])\\s+(?=[az]) ,这意味着匹配任何前面的空格一次或多次. ? 或者! 然后是[az] (不要忘记i修饰符)。

现在让我们根据这个问题的需要对其进行修改:

  1. 我们首先将其转换为JAVA正则表达式: (?<=[.?!])\\\\s+(?=[az])
  2. 我们将添加i修饰符以匹配不区分大小写(?i)(?<=[.?!])\\\\s+(?=[az])
  3. 我们将表达放在一个积极的先行中,以防止字符的“吃”(在这种情况下是分隔符): (?=(?i)(?<=[.?!])\\\\s+(?=[az]))
  4. 我们将添加一个负向lookbehind以检查LETTER DOT LETTER DOT格式中是否没有缩写:( (?i)(?<=[.?!])(?<![az]\\.[az]\\.)\\\\s+(?=[az])

所以我们的最终正则表达式如下:( (?i)(?<=[.?!])(?<![az]\\.[az]\\.)\\\\s+(?=[az])

一些链接:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM