【问题标题】:string.replaceAll to replace occurrencesstring.replaceAll 替换出现
【发布时间】:2013-04-29 10:58:00
【问题描述】:

我需要替换一个字符串:

"abc.T.T.AT.T"

将所有单个T 替换为TOT 之类的字符串

"abc.TOT.TOT.AT.TOT"

strings.replaceAll 不适合这个。

【问题讨论】:

标签: java regex string


【解决方案1】:

环顾四周将解决您的问题:

s.replaceAll("(?<=\\.|^)T(?=\\.|$)", "TOT");

如果你这样做:

String s = "T.T.T.AT.T.fT.T.T";
System.out.println(s.replaceAll("(?<=\\.|^)T(?=\\.|$)", "TOT"));

输出将是:

TOT.TOT.TOT.AT.TOT.fT.TOT.TOT

【讨论】:

  • 只是出于好奇,当字符串有这样的内容时会发生什么:- .(space)T(space)(space).?
  • 那么替换语句将不起作用。它仅基于 OP 的示例。 “点”分开。很确定他没有提到single T 的定义。至少我的代码应该适用于他的例子。
  • 一个等价但超级混乱的正则表达式是(?&lt;![^.])T(?![^.])
  • @nhahtdh 你打错字了,我想你的意思是(?&lt;![^.])T(?![^.])否定的否定...:D
  • @Kent:在您发表评论之前暂时修复了它。 (问题是忘记了后视的&lt;)。
【解决方案2】:

您可以使用word boundaries 执行此任务:

text.replaceAll("\\bT\\b", "TOT");

这将替换一个“T”,前提是它的前面和后面都没有另一个单词字符(意味着前面或前面没有其他字母或数字)。

这将适用于您的示例。但是您应该知道,这将匹配所有带有非单词字符的“T”。替换将是,例如:

  • .T.
  • %T%
  • ,T,
  • !T-

但不是“T”在:

  • .这个。
  • .AT.
  • .1T2.
  • .T3

【讨论】:

  • 没有字母或数字或下划线。所以T 中的%T% 将被替换。我并不是说这是错误的,只是为了 OP 的信息。
  • @nhahtdh,感谢您的澄清。我在回答中添加了一些示例。
【解决方案3】:
String input = "abc.T.T.AT.T";
        StringTokenizer st = new StringTokenizer(input,".");
        StringBuffer sb = new StringBuffer();
        while(st.hasMoreTokens()){
            String token = st.nextToken();
            if(token.equals("T")){
                token= token.replace("T", "TOT");
            }
            sb.append(token+".");
        }
            if(!(input.lastIndexOf(".")==input.length()-1))
            sb.deleteCharAt(sb.lastIndexOf("."));
        System.out.println(sb.toString());

希望这是你需要的......

【讨论】:

  • 这将在末尾添加一个额外的句点。
  • 最后只做 ..sb.deleteCharAt(sb.lastIndexOf("."));
  • 它不适用于abt.T.T.。我对只适用于某些输入的解决方案有点过敏。 (没有反对票,但我差点投反对票。)
  • 很抱歉错过了这个。让我在删除之前添加一个检查
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多