Java查找和替换字符串的最佳方法?

vas*_*ske 29 java string

我正在寻找Java中字符串查找和替换的最佳方法.

这是一句话:"我的名字是米兰,人们都认为我是米兰瓦西奇".

我想用米兰瓦西奇代替米兰,但在我已经有米兰瓦西奇的地方,这应该不是一个案例.

搜索/替换后的结果应该是:"我的名字是米兰瓦西奇,人们都认识我为米兰瓦西奇".

我尝试使用indexOf()以及Pattern/Matcher组合,但我的结果都不优雅,有人有优雅的解决方案吗?

干杯!

Joe*_*oey 45

那么,您可以使用正则表达式来查找"米兰"未跟随"Vasic"的情况:

Milan(?! Vasic)
Run Code Online (Sandbox Code Playgroud)

并用全名替换:

String.replaceAll("Milan(?! Vasic)", "Milan Vasic")
Run Code Online (Sandbox Code Playgroud)

(?!...)部分是一个负向前瞻,它确保括号中的部分后面没有任何匹配.它不会消耗匹配中的任何字符.

或者,您可以简单地插入(在技术上替换零宽度匹配)名字后面的姓氏,除非它后面跟着姓氏.这看起来很相似,但也使用积极的lookbehind:

(?<=Milan)(?! Vasic)
Run Code Online (Sandbox Code Playgroud)

你可以只用它来替换它" Vasic"(注意字符串开头的空格):

String.replaceAll("(?<=Milan)(?! Vasic)", " Vasic")
Run Code Online (Sandbox Code Playgroud)

例如,你可以在这里试试这些东西.


McD*_*ell 24

另外一个选项:

"My name is Milan, people know me as Milan Vasic"
    .replaceAll("Milan Vasic|Milan", "Milan Vasic"))
Run Code Online (Sandbox Code Playgroud)

  • 更优雅的答案! (2认同)

Fab*_*eeg 8

一种可能性,在扩展所有之前减少更长的形式:

string.replaceAll("Milan Vasic", "Milan").replaceAll("Milan", "Milan Vasic")
Run Code Online (Sandbox Code Playgroud)

另一种方法,将Vasic视为可选:

string.replaceAll("Milan( Vasic)?", "Milan Vasic")
Run Code Online (Sandbox Code Playgroud)

其他人已经描述了基于先行替代的解决方案.


Mar*_*erg 5

当你不想把你的手放在正则表达式上时(可能你应该这样做),你可以先用“Milan”替换所有“Milan Vasic”字符串。

然后用“Milan Vasic”替换所有“Milan”字符串。