【问题标题】:Replacing the strings in text with values of the key in HashMap将文本中的字符串替换为 HashMap 中键的值
【发布时间】:2014-09-08 09:25:08
【问题描述】:

主要目标是将字符串中的一些单词替换为键的哈希图中的值(键是文本中的单词)。密钥的格式不同。 例如: 正文:“Lookahead 和lookbehind,统称为lookaround,是[0-23] 断言” 哈希图: {Lookahead=test1,lookbehind=test2,lookaround=test3,[0-23]=newvalue} 预期输出: “test1 和 test2 统称为 test3,是新值断言”

我可以制作字典,但替换部分是我需要帮助的地方。我无法替换 [0-23] 之类的键。因为 replaceAll 不考虑 - 、 [ 和 ]。

【问题讨论】:

    标签: java regex hashmap


    【解决方案1】:

    您可以执行以下操作:

    mainText.replaceAll(java.util.regex.Pattern.quote(entry.getKey()), java.util.regex.Matcher.quoteReplacement(entry.getValue()))
    

    java.util.regex.Pattern.quote 的调用将逐字处理任何特殊的正则表达式字符。 对替换字符串的java.util.regex.Matcher.quoteReplacement 调用也会对具有一些特殊字符的替换字符串执行相同的操作。

    它(几乎)都在 Javadoc 方法中:

    String java.lang.String.replaceAll(字符串正则表达式,字符串替换)

    替换此字符串中与给定正则匹配的每个子字符串 具有给定替换的表达式。调用此方法 形式 str.replaceAll(regex, repl) 产生完全相同的结果 作为表达式 java.util.regex.Pattern.compile(regex).matcher(str).replaceAll(repl) 注意替换中的反斜杠 () 和美元符号 ($) 字符串可能会导致结果与之前的结果不同 视为文字替换字符串;请参阅 Matcher.replaceAll。使用
    java.util.regex.Matcher.quoteReplacement 抑制特殊 如果需要,这些字符的含义。参数:正则表达式 此字符串要匹配的正则表达式替换 每个匹配项要替换的字符串 返回:结果 字符串抛出:PatternSyntaxException - 如果正则表达式的 语法无效因为: 1.4 另见:java.util.regex.Pattern @spec JSR-51

    【讨论】:

    • 谢谢。但我仍然得到“PatternSyntaxException: Illegal character for "-" "
    • 我刚刚编辑了答案。我有一个错误。你能再试一次吗?
    • 使用“链接”值失败,例如:{grapes=pineapple,apple=banana,banana=cherry,pear=apple,cherry=pear}
    • @DávidHorváth 你说得对,但我相信这里并非如此。您的用例引入了一个更复杂的问题需要解决。在这种情况下,最好的办法是用一些元字符(例如 {{KEY}})围绕键并使其值中的非法序列。感谢您的评论!
    猜你喜欢
    • 2015-04-03
    • 2021-03-30
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2021-01-06
    • 2011-01-07
    • 1970-01-01
    相关资源
    最近更新 更多