Dai*_*isy 4 java regex twitter utf-8
我试图用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 ");
Run Code Online (Sandbox Code Playgroud)
但它并没有取代它们.即使我只匹配字符本身"\ u1F602",它也不会替换它.可能是因为它是你之后的5位数?!我不确定,只是一个猜测.
注意:
1-推特结束时的情绪()是"U + 1F602",即"面对欢乐的泪水"
2-这个问题不是重复的问题.
有任何想法吗?
Unicode字符也可以通过使用其十六进制表示法(十六进制代码点值)直接如构造中所述在正则表达式中表示
\x{...},例如可以指定补充字符U + 2011F\x{2011F},而不是两个连续的Unicode转义序列.代理对\uD840\uDD1F.
这意味着您正在寻找的正则表达式([\x{1F601}-\x{1F64F}]).当然,当您将其写为Java String文字时,必须转义反斜杠.
Pattern unicodeOutliers = Pattern.compile("([\\x{1F601}-\\x{1F64F}])");
Run Code Online (Sandbox Code Playgroud)
请注意,该构造\x{...}仅适用于Java 7.
如果您在Java 5或6 JVM上运行程序时遇到困难,并且想要匹配U + 1F601到U + 1F64F范围内的字符,请在字符类中使用代理项对:
Pattern emoticons = Pattern.compile("[\uD83D\uDE01-\uD83D\uDE4F]");
Run Code Online (Sandbox Code Playgroud)
此方法即使在Java 7及更高版本中也是有效的,因为在Sun/Oracle的实现中,如果您使用反编译Pattern.compile()方法,则在编译之前将包含该模式的String转换为代码点数组.
您可以\x{...}在David Wallace的答案中使用该构造,该答案可从Java 7获得.
或者,您也可以指定整个表情符号Unicode块,它从代码点U + 1F600(而不是U + 1F601)到U + 1F64F.
Pattern emoticons = Pattern.compile("\\p{InEmoticons}");
Run Code Online (Sandbox Code Playgroud)
由于在Java 7中添加了表情符号块支持,因此该方法仅在Java 7中有效.
虽然首选其他方法,但您可以通过在正则表达式中指定转义来指定补充字符.虽然没有理由在源代码中执行此操作,但Java 7中的此更改会更正使用正则表达式进行搜索的应用程序中的行为,并且无法直接粘贴该字符.
Pattern emoticons = Pattern.compile("[\\uD83D\\uDE01-\\uD83D\\uDE4F]");
Run Code Online (Sandbox Code Playgroud)
/!\ 警告在指定补充代码点时,永远不要将语法混合在一起,例如:
"[\\uD83D\uDE01-\\uD83D\\uDE4F]"
"[\uD83D\\uDE01-\\uD83D\\uDE4F]"
这些将指定匹配代码点U + D83D以及Oracle实现中代码点U + DE01到代码点U + 1F64F的范围.
在Java 5和6中,Oracle的实现,实现Pattern.u()不会崩溃有效的正则表达式转义的代理对"\\uD83D\\uDE01".结果,该模式被解释为2个单独的代理,这将无法匹配任何东西.
| 归档时间: |
|
| 查看次数: |
3283 次 |
| 最近记录: |