Perl utf8换行更换

时间:2014-02-13 19:49:44

标签: regex perl twitter

编辑: 抱歉!似乎阿拉伯语和其他文本的奇怪的换行行为完全是由于其他原因。不幸的是,我在玩这个剧本的同时注意到了它。


我正在尝试重新格式化Perl中TTYtter给出的文本字段。 (来源here

文本定义为“状态更新的实际UTF-8文本。有关当前认为有效字符的详细信息,请参阅twitter-text。” (来自Twitter开发页面)。

使用

$txtin = $ref->{'text'};
$txtin =~ s/\\n\s*/ \\ /g;

删除并替换换行符为“英语”(西方?)文本的罚款,但对其他语言做了一些奇怪的事情。 希腊语&阿拉伯语文本似乎使用这种替换字符串方法添加了新行。

我尝试过匹配\ p {Zl}(在CPAN-perlunicode.pod中找到),例如:

$txtin =~ s/\p{Z1}\s*/ \\ /g;

但是在西化的推文中留下了\ n,因此它与我期望/希望的不匹配。

所以基本上,我的问题是:如何替换utf8 blob文本(推文)中的所有换行/符号字符,这将适用于西里尔语,阿拉伯语,汉字和& Perl中的西方内容?

谢谢!


编辑:如果您错过了第一次编辑并阅读了这一点,这是一个基于错误假设的问题。这不是新线剥离引起的问题。显然,这是一个完全与上述无关的文本包装问题。此问题现已标记为审核(因为我无法将其删除)。

3 个答案:

答案 0 :(得分:3)

\\匹配单个反斜杠字符,因此/\\p{Z1}/匹配反斜杠,然后匹配文字字符串p{Z1}。要匹配字符类\p{Z1},您需要在正则表达式的开头添加一个或多个反斜杠,具体取决于输入是否包含反斜杠。

答案 1 :(得分:3)

s/\\n\s*/ \\ /g不会删除并替换“英语”(西方?)文本 [1] 的换行符,并且不会为希腊语和阿拉伯语文本添加换行符。我不知道你使用了什么,但是要替换一个可选地后跟空格的换行符,你可以在解码后的文本上使用以下内容:

s/\n\s*/.../g
  • \n匹配换行符。
  • \\n匹配两个字符\n
  • \p{Z1}匹配U + 2028 LINE SEPARATOR(但不是新行)。
  • \\p{Z1}匹配6个字符\p{Z1}
  • 换行符是换行符,无论其附近有什么字符。
  

如何替换utf8 blob文本(推文)中的所有换行符/ cr符号,这些符号适用于西里尔语,阿拉伯语,汉字和&... Perl中的西方内容?

换行符是换行符,无论其附近有什么字符。回车也是如此。

utf8::decode( my $unicode_chars = $utf8_bytes );
$unicode_chars =~ s/[\r\n]/.../g;
utf8::encode( $utf8_bytes = $unicode_chars );

或许你在问如何替换垂直空白字符?

utf8::decode( my $unicode_chars = $utf8_bytes );
$unicode_chars =~ s/\v/.../g;
utf8::encode( $utf8_bytes = $unicode_chars );

注意:

  1. 除非他们碰巧使用反斜杠和“n”。

答案 2 :(得分:0)

唉唉。显然这是关闭它的一种方法。请参阅EDIT的原始版本。显然这是一个自动换行问题,与删除换行符无关。