使用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”,它也不会取代它。 可能是因为它是你之后的5位数?! 我不确定,只是一个猜测。

注意:

1-推特结束时的情绪(😂)是“U + 1F602”,即“面对欢乐的泪水”

2-这个问题与这个问题不重复。

有任何想法吗?

来自Pattern类的Javadoc

Unicode字符也可以通过使用其hex表示法(hex代码点值)直接表示为正则表达式,如构造\x{...} ,例如,补充字符U + 2011F可以指定为\x{2011F} ,而不是代理对\uD840\uDD1F的两个连续Unicode转义序列。

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

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

请注意,construct \x{...}仅可从Java 7获得。

Java 5和6

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

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

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

Java 7及以上版本

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

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

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

    由于在Java 7中添加了表情符号块支持,因此该方法仅在Java 7中有效。

  3. 虽然首选其他方法,但您可以通过在正则表达式中指定转义来指定补充字符。 虽然没有理由在源代码中执行此操作,但Java 7中的此更改会更正使用正则表达式进行搜索的应用程序中的行为,并且无法直接粘贴该字符。

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

    /!\警告

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

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

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

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

注意

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