使用Java替换阿拉伯语推文中的Emoji Unicode范围 [英] Replacing Emoji Unicode Range from Arabic Tweets using Java
问题描述
我正在尝试使用Java替换阿拉伯语推文中的emoji。
我使用了以下代码:
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",即"joy泪流满面"
2-此问题不是this question的重复问题。
有什么想法吗?
推荐答案
Java 5和6
如果您在Java 5或6 JVM上运行程序,并且希望匹配U+1F601到U+1F64F范围内的字符,请在Character类中使用代理项对:
Pattern emoticons = Pattern.compile("[uD83DuDE01-uD83DuDE4F]");
此方法即使在Java 7及更高版本中也有效,因为在Sun/Oracle的实现中,如果反编译Pattern.compile()
方法,则包含模式的字符串在编译前被转换为代码点数组。
Java 7及更高版本
您可以在David Wallace的答案中使用
x{...}
结构,该结构可从Java 7获得。或者,您也可以指定从代码点U+1F600(而不是U+1F601)到U+1F64F的整个Emoticons Unicode block。
Pattern emoticons = Pattern.compile("\p{InEmoticons}");
由于Java 7中添加了Emoticons block支持,因此此方法也仅在Java 7中有效。
虽然其他方法也是首选方法,但您可以通过在正则表达式中指定转义来指定补充字符。虽然在源代码中没有理由这样做,但Java 7中的这一更改更正了使用正则表达式进行搜索的应用程序中的行为,并且不能直接粘贴字符。
Pattern emoticons = Pattern.compile("[\uD83D\uDE01-\uD83D\uDE4F]");
/!
警告永远不要在指定补充代码点时将语法混合在一起,如:
"[\uD83DuDE01-\uD83D\uDE4F]"
/li>"[uD83D\uDE01-\uD83D\uDE4F]"
它们将指定匹配Oracle实现中的代码点U+D83D和从代码点U+DE01到代码点U+1F64F的范围。
注意:
在Oracle的实现Java 5和6中,Pattern.u()
的实现不会折叠有效的正则表达式转义代理对"\uD83D\uDE01"
。因此,该模式被解释为两个单独的代理,它们将无法匹配任何内容。
这篇关于使用Java替换阿拉伯语推文中的Emoji Unicode范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!