我发现这很难解释,所以我将开始介绍我想要实现的前后几个例子。
输入示例:
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。”。
我用正则表达式尝试了各种各样的东西,但这并不是我的强项,所以我希望这里的某个人有任何我可以使用的想法或指示。
答案 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)
由于每个单词都以大写(大写)字母开头,我建议您首先删除所有点,然后将其替换为空格(“”)。然后,迭代所有字符并在小写字母和大写字母之间放置空格。此外,如果遇到大写后跟小写的大写,请将空格放在大写之前。
它适用于您提供的所有示例,但我不确定我的观察是否有任何例外。