用“。”拆分字符串。 (点)处理缩写时

时间:2013-06-13 23:22:57

标签: java regex

我发现这很难解释,所以我将开始介绍我想要实现的前后几个例子。

输入示例

  

Hello.World

     

This.Is.A.Test

     

The.S.W.A.T.Team

     

S.W.A.T。

     

s.w.a.t。

     

2001.A.Space.Odyssey

通缉输出:

  

Hello World

     

这是一个测试

     

特警队

     

SWAT

     

SWAT

     

2001 A Space Odyssey

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

我对缩写的定义是至少有两个字符(无关紧要)和两个点,即“A.B.”或“a.b.”。它不应该使用数字,即“1.a。”。

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

2 个答案:

答案 0 :(得分: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

在正则表达式中,我需要摆脱点字符的特殊含义。我可以使用\\.来完成,但我更喜欢[.]

因此,在正则表达式中,我们有点文字。现在,此点被(?<=...)(?=...)包围。这些是look-around机制的一部分,称为 look-behind look-ahead

  • 由于需要删除的点有点(或数据的开头^)和一些非空白的\\S,前面也是非数字\ D字符我可以使用(?<=(^|[.])[\\S&&\\D])[.]进行测试。

  • 此外,需要删除的点也包含非空白和非数字字符以及其后的另一个点(可选择数据末尾$),可以写为{{1 }}


根据需要[.](?=[\\S&&\\D]([.]|$)),除了字母之外,[\\S&&\\D]之类的字符只能用!@#$%^&*()-_=+...代替英文字母,或[a-zA-Z]代替Unicode中的所有字母。< / p>

答案 1 :(得分:0)

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

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