【问题标题】:String replaceALL with conditions on letters before and after the match字符串 replaceALL 与匹配前后字母的条件
【发布时间】:2016-07-24 11:37:02
【问题描述】:

我正在从文本文件中读取字符串

示例:密西西比州是一个拥有大量系统的州吗?

我正在尝试使用全部替换来用相同的大小写“t”或“T”替换所有“s”和“S”,除非在单词的开头并且除非在“s”或“S”之前或之后" 还有另一个 "s" 或 "S"。

预期输出:密西西比州是一个有很多 Syttemt 的州?

我试过了……

.replaceAll("[^sStT](?!\\b)S", "T").replaceAll("[^SstT](?!\\b)s", "t"); 

输出是...“t Mtstsippi 是一个有很多 Sttet 的州吗?”

【问题讨论】:

  • .replaceAll("[^sStT](?!\\b)S", "T").replaceAll("[^SstT](?!\\b)s", "t ");输出是......“t Mtstsippi 是一个有很多 Sttet 的州?”
  • 那会给你什么输出?
  • 将附加信息(您的代码和结果输出)添加到问题中,而不是在评论中。
  • @RealSkeptic :系统新手...感谢您提供的信息...我将其放入问题中

标签: java regex conditional replaceall


【解决方案1】:

我知道已经有一个公认的答案,但这是另一种方法来实现你想要的,使用一点 java hack 和消极的后视/之后。

String s = "Is Mississippi a State where there are a lot of Systems?";
s = s.replaceAll("(?<![ sS])(s|S)(?![sS])", Character.isUpperCase("$1".charAt(0)) ? "T" : "t");
System.out.println(s); // It Mississippi a State where there are a lot of Syttemt?

【讨论】:

  • 我很困惑"$1".charAt(0) 是如何实际获得它的值的。在调用replaceAll 之前不会评估$1 吗?
  • 其实我只是用大写字符测试过这个!在所有情况下,第二个参数总是被评估为"t"。您正在查看"$"
  • @flkes 你是对的。您认为解决方案是什么?
  • 我想进行两次调用来替换。不确定如何为单个 replaceAll 执行此操作
【解决方案2】:

您可以通过两个replaceAll 调用来做到这一点。一个用于s -&gt; t,一个用于S -&gt; T

您可以使用后视(?&lt;=regex) 和前瞻(?=regex) 组来查找模式而不替换其内容。

look-behind 将检查s 之前的字符是否不在[^&lt;list&gt;] 字符列表中。此列表包括起始字符 ^sStT 和空格 \\s

(?&lt;=[^^\\ssStT])

前瞻会做类似的检查,但只验证下一个字符不是sS

(?=[^sS])

把这一切放在一起:

String test = "Is Mississippi a State where there are a lot of Systems?";
System.out.println(test
        .replaceAll("(?<=[^^\\ssStT])s(?=[^sS])","t")
        .replaceAll("(?<=[^^\\ssStT])S(?=[^sS])","T")
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 2011-10-05
    • 2020-12-21
    • 1970-01-01
    • 2011-01-09
    • 2011-02-11
    • 1970-01-01
    相关资源
    最近更新 更多