Java 如何在句子末尾的句号后插入空格,而不是缩写或浮点数?

Java 如何在句子末尾的句号后插入空格,而不是缩写或浮点数?,java,regex,Java,Regex,我有一个JTextArea,我想在它旁边没有空格的地方替换所有句号,例如“这是一个句子。这是另一个C.O.D.句子。这是另一个C.a.T.句子。”到“这是一个句子。这是另一个C.O.D.句子。这是另一个C.a.T.句子。”。但我不希望缩写或浮点数获得额外的空格,例如“这是一个C.a.t.浮点5.5”不应该变成“这是一个C.a.t.浮点5.5”!我正在使用string.replaceAll(“.”,“”)来处理这个问题,但事实证明这是不够的。您可以使用正则表达式 ([^A-Z])\.(?!\d)

我有一个JTextArea,我想在它旁边没有空格的地方替换所有句号,例如“这是一个句子。这是另一个C.O.D.句子。这是另一个C.a.T.句子。”到“这是一个句子。这是另一个C.O.D.句子。这是另一个C.a.T.句子。”。但我不希望缩写或浮点数获得额外的空格,例如“这是一个C.a.t.浮点5.5”不应该变成“这是一个C.a.t.浮点5.5”!我正在使用string.replaceAll(“.”,“”)来处理这个问题,但事实证明这是不够的。

您可以使用正则表达式

([^A-Z])\.(?!\d)
替换所有的“.”,后面不跟数字,前面不跟大写字母

请参阅,

(您应该编辑您的问题,以明确说明您的要求,例如缩写词的处理)

您可以将
(?替换为

演示:

说明:

(?<!       )          negative look-behind group
    \b[A-Z]           word boundary following by one uppercase character
                      (i.e. one upper case character)
            \.        a dot
              (?!\d)  negative look-ahead group, of single digit
(?
这基本上意味着,如果一个点前面没有单个大写字符,后面没有数字,则替换它


仍然存在一些缺陷,它将无法取代
Hello world.1 apple 1 day
。如果您理解上述正则表达式,那么更改正则表达式来修复这些缺陷应该不难。

保持简单,没有负面外观落后等:

s = s.replaceAll("([^A-Z0-9.])\\.([^0-9 \t])", "$1. $2");
在以下情况下替换该期间:

  • 在资本本身之后(U.N.C.或M.Twain)
  • 数字后(1.-希望句子不以数字结尾)
  • 经过一段时间(…)
  • 数字前(.5-希望下一句话不是以数字开头)
  • 在空格或制表符之前

使用一些正则表达式。是否也要将“M.Twain”替换为“M.Twain”?请参阅此解决方案@Willmore No我不想将“M.Twain”替换为“M.Twain”。@marvel308的解决方案将“M.Twain”更改为“M.Twain”,这对于缩写是不可取的。在编辑的答案中,正则表达式是删除点之前的字母!不会的,您必须用“M.Twain”替换(第一组)。“根据OP的(不明确的)要求,
您好,查看在线编译器结果。任何
都不被视为缩写,应该被替换…(老实说,我认为您的解决方案非常合理。OP的问题更多的是没有给出明确的要求)