9

我发现这很难解释,所以我先举几个我想要实现的之前/之后的例子。

输入示例

你好世界

这是一个测验

特警队

扑打

扑打

2001.A.太空.奥德赛

想要的输出:

你好世界

这是一个测验

特警队

扑打

扑打

2001 太空漫游

本质上,我想创建一些能够按点分割字符串,但同时处理缩写的东西。

我对缩写的定义是至少有两个字符(大小写无关)和两个点,即“AB”或“ab”。它不应该与数字一起使用,即“1.a.”。

我用正则表达式尝试了各种各样的东西,但这并不是我的强项,所以我希望这里的人有任何想法或指示我可以使用。

4

2 回答 2

11

如何删除需要用正则表达式消失的点,然后用空格替换其余的点?正则表达式可能看起来像(?<=(^|[.])[\\S&&\\D])[.](?=[\\S&&\\D]([.]|$)).

String[] data = { 
        "Hello.World", 
        "This.Is.A.Test", 
        "The.S.W.A.T.Team",
        "S.w.a.T.", 
        "S.w.a.T.1", 
        "2001.A.Space.Odyssey" };

for (String s : data) {
    System.out.println(s.replaceAll(
            "(?<=(^|[.])[\\S&&\\D])[.](?=[\\S&&\\D]([.]|$))", "")
            .replace('.', ' '));
}

结果

Hello World
This Is A Test
The SWAT Team
SwaT 
SwaT 1
2001 A Space Odyssey

在正则表达式中,我需要转义点字符的特殊含义。我可以做到,\\.但我更喜欢[.].

所以在正则表达式的慢跑中,我们有点字面量。现在这个点被(?<=...)and包围了(?=...)。这些是称为look-behindlook-ahead的环视机制的一部分。

  • 由于需要删除的点有 dot (或 data 的开头^)和一些非数字 \D 字符的非空白空间\\S,因此我可以使用(?<=(^|[.])[\\S&&\\D])[.].

  • 此外,需要删除的点还有非空白和非数字字符以及后面的另一个点(可选数据结尾$),可以写为[.](?=[\\S&&\\D]([.]|$))


根据需要[\\S&&\\D],字母旁边还匹配字符,例如!@#$%^&*()-_=+...可以仅替换[a-zA-Z]为英文字母或\\p{IsAlphabetic}Unicode 中的所有字母。

于 2013-06-13T23:46:25.427 回答
0

由于每个单词都以大写(大写)字母开头,因此我建议您首先删除所有点,然后将其替换为没有空格(“”)。然后,遍历所有字符并在小写字母和后面的大写字母之间放置空格。另外,如果遇到大写后面有小写,请在大写之前放置空格。

它适用于您提供的所有示例,但我不确定我的观察是否有任何例外。

于 2013-06-13T23:27:04.997 回答