使用Java替换阿拉伯推文中的表情符号Unicode范围



我正在尝试用java替换阿拉伯语推文中的表情符号。

我用了这个代码:

String line = "اييه تقولي اجل الارسنال تعادل امس بعد ما كان فايز 😂😂";
Pattern unicodeOutliers = Pattern.compile("([u1F601-u1F64F])", Pattern.UNICODE_CASE | Pattern.CANON_EQ | Pattern.CASE_INSENSITIVE);
Matcher unicodeOutlierMatcher = unicodeOutliers.matcher(line);
line = unicodeOutlierMatcher.replaceAll(" $1 ");

但它并没有取代它们。即使我只匹配字符本身"\u1F602",它也不会替换它。可能是因为它在u后面有5位?!我不确定,只是猜测。

注意:

1-推文结尾的情绪(😂)是"U+1F602",也就是"喜极而泣的脸"

2-这个问题不是这个问题的重复。

有什么想法吗?

来自Pattern类的Javadoc

Unicode字符也可以在正则表达式中表示为直接使用其十六进制表示法(十六进制代码点值)作为构造x{...}中描述的,例如补充字符U+2011F可以指定为x{2011F},而不是两个连续的代理项对uD840uDD1F的Unicode转义序列。

这意味着您要查找的正则表达式是([x{1F601}-x{1F64F}])。当然,当您将其作为Java String文字编写时,必须转义反斜杠。

Pattern unicodeOutliers = Pattern.compile("([\x{1F601}-\x{1F64F}])");

请注意,构造x{...}只能从Java 7中获得。

Java 5和6

如果您在Java 5或6 JVM上运行程序时遇到问题,并且希望匹配从U+1F601到U+1F64F范围内的字符,请使用字符类中的代理项对:

Pattern emoticons = Pattern.compile("[uD83DuDE01-uD83DuDE4F]");

此方法即使在Java 7及以上版本中也是有效的,因为在Sun/Oracle的实现中,如果反编译Pattern.compile()方法,则在编译之前,包含模式的String将转换为代码点数组。

Java 7及以上版本

  1. 您可以在David Wallace的答案中使用构造x{...},该答案可从Java 7中获得。

  2. 或者,您也可以指定整个表情符号Unicode块,它从代码点U+1F600(而不是U+1F601)到U+1F64F。

    Pattern emoticons = Pattern.compile("\p{InEmoticons}");
    

    由于表情符号块支持是在Java7中添加的,因此此方法也仅在Java7上有效。

  3. 尽管首选其他方法,但您可以通过在正则表达式中指定转义符来指定补充字符。虽然在源代码中没有这样做的理由,但Java7中的这一更改纠正了使用regex进行搜索的应用程序中的行为,并且不可能直接粘贴字符。

    Pattern emoticons = Pattern.compile("[\uD83D\uDE01-\uD83D\uDE4F]");
    

    /!警告

    当您指定补充代码点时,永远不要将语法混合在一起,例如:

    • "[\uD83DuDE01-\uD83D\uDE4F]"

    • "[uD83D\uDE01-\uD83D\uDE4F]"

    这些将指定匹配Oracle实现中的代码点U+D83D和从代码点U+TE01到代码点U+1F64F的范围。

备注

在Java 5和6(Oracle的实现)中,Pattern.u()的实现不会折叠有效的正则表达式转义的代理项对"\uD83D\uDE01"。结果,该模式被解释为两个单独的代孕,这将无法匹配任何内容。

最新更新