【问题标题】:Unicode character support as range in regexUnicode 字符支持作为正则表达式中的范围
【发布时间】:2021-05-20 12:47:42
【问题描述】:

我正在编写一个正则表达式来支持大小写字母、数字、- 和 00C0-00FF 范围内的 Unicode 字符。

我已经看到解释使用正则表达式支持所有语言字符的答案 \p{L}+ 但我不想支持所有语言字符。我只想支持来自 URL https://unicode-table.com/en/blocks/latin-1-supplement/ 的特定范围 [00C0-00FF] 的 Unicode 字符

我在网站https://regex101.com/ 上使用模式[A-Za-z0-9\x{00C0}-\x{00FF}'’\- ]{1,70} 测试了我的示例字符串O’Donnell À Ö ö Ì ÿ 012 但是这种模式[A-Za-z0-9\x{00C0}-\x{00FF}'’\- ]{1,70} 在 java 中不起作用。请您支持我为 Java 编写等效模式。

我用来测试正则表达式的示例代码 -

public static void main(String... args) {
        Pattern p = Pattern.compile("[A-Za-z0-9\\x{00C0}-\\x{00FF}'’\\- ]{1,70}",
                                    Pattern.UNICODE_CHARACTER_CLASS);
        Matcher m = p.matcher("O’Donnell À Ö ö Ì ÿ 012");
        boolean b = m.matches();
        System.out.println("value=" + b);
    }

【问题讨论】:

标签: java regex unicode


【解决方案1】:

使用\\u 而不是\x 并删除大括号并在您的正则表达式中添加转义序列,使其变为:

"[A-Za-z0-9\\u00C0-\\u00FF'’\\- ]{1,70}"

【讨论】:

  • 您正在测试哪个 java 版本?
  • 我使用的是 Java 14
【解决方案2】:

虽然上面发布的答案工作正常,但由于 Windows 文件编辑器编码问题,它可能在 Windows 机器上失败。对于 Unicode 字符,应使用 UTF-8 编码来保存文件。在字符串中使用特殊字符的 Unicode 值也很好,如下例所述。

import java.util.regex.Pattern;

public class Main {

    public static void main(String[] args) {
        String str = "O'Donnell \u00C0 \u00D6 \u00F6 \u00CC \u00FF 012"; // Unicode value of string 'O’Donnell À Ö ö Ì ÿ 012'
        System.out.println(Pattern.matches("[A-Za-z0-9\\u00C0-\\u00FF'’\\- ]{1,70}", str));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-02
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多