【问题标题】:How do I concatenate ranges in a regular expression?如何在正则表达式中连接范围?
【发布时间】:2015-05-16 07:38:05
【问题描述】:

我想将两个连接的字符: \uD800\uDC00 更改为 x 但奇怪的是它给出了一个奇怪的字符,有人可以告诉我这里有什么问题吗? 当我运行以下代码时:

System.out.println("\uD800\uDC00".replaceAll("([\uD800-\uDBFF]&&['\uDC00'-'\uDFFF'])", "x"));

我得到这个字符作为输出

??????

【问题讨论】:

    标签: java regex


    【解决方案1】:

    首先,正则表达式中存在语法错误。模式中的“&&”不应该在那里。同样,单引号和括号也不应该在那里。

    上面的语法更正是必需的,但还不够。 \uD800 是一个“魔法”角色。它与下一个字符组合形成一个 4 字节的 Unicode 代码点:https://en.wikipedia.org/wiki/Universal_Character_Set_characters#Surrogates

    正则表达式是使用 Unicode 代码点解释的,而不是 Java 字符。 \uD800\uDC00 是单个 Unicode 代码点 (0x10000),因此正则表达式不匹配。我认为您可能想要排除 16 位范围 \u0000 - \uFFFF 之外的所有 Unicode 代码点。所以这可能就是你想要的:

    System.out.println("\uD800\uDC00".replaceAll("[^\u0000-\uFFFF]", "x"));
    

    【讨论】:

      【解决方案2】:

      这个子串

      ([\uD800-\uDBFF]&&['\uDC00'-'\uDFFF'])
      

      没有出现在字符串中

      \uD800\uDC00
      

      所以“x”没有替换任何东西。

      【讨论】:

      • 那么 replaceAll 会尝试在您提供的字符串中找到该子字符串。如果要替换它,则需要提供具有相应子字符串的字符串。 replaceAll 仅适用于字符串。下面是一个使用 replaceAll 的示例:replaceAll
      • 是的,但我想将这些字符的串联更改为 x,所以我不必显示那个正方形
      • 如果您提供的字符串具有该连接,您的代码将执行此操作。它没有。我认为您在逻辑上试图通过两种可能编写 String 的方式来传递它,但您是在一行中完成的。您需要对可能编写连接的每种方式进行两次检查。
      猜你喜欢
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多