【问题标题】:minor changes on a regex to deal with special chars [ä,ö,ü,ß...]对正则表达式进行细微更改以处理特殊字符 [ä,ö,ü,ß...]
【发布时间】:2011-06-29 11:05:55
【问题描述】:

我已经解析了一个更大的数据集:我遇到了一个问题:解析数据集的结果 - (德语)。看一个例子 - 剩下一点:在德语中,我们有无法正确识别的特殊字符....请参阅以下几行 - 结果:

lfd. Nr. Schul- nummer Schulname Stra�e PLZ Ort Telefon Fax Schulart Webseite
1 0401 M�dchenrealschule Marienburg,�Abenberg, der Di�zese Eichst�tt Marienburg 1 91183� Abenberg�  09178/509210  Realschulen  mrs-marienburg.homepage.t-online.de 
2 6581 Volksschule Abenberg�(Grundschule) G�ss�belstr. 2 91183� Abenberg�  09178/215 09178/905060 Volksschulen  home.t-online.de/home/vs-abenberg 
3 6913 Mittelschule Abenberg� G�ss�belstr. 2 91183� Abenberg�  09178/215 09178/905060 Volksschulen  home.t-online.de/home/vs-abenberg 
4 0402 Johann-Turmair-Realschule�Staatliche Realschule Abensberg Stadionstra�e 46 93326� Abensberg�  09443/9143-0,12,13 09443/914330 Realschulen  www.rs-abensberg.de 
5 3041 Cabrini-Schule Offenstetten, Priv. F�rderzentrum�F�rderschwerp. geist.Entwickl. d. Kath.Jugendf�rs. Am Schmiedweiher 8 93326� Abensberg�Offenstetten 09443/9188-3 09443/918855 Volksschulen zur sonderp�dog. F�rderung  www.cabrinischule.de 
6 3074 Private Berufsschule zur sonderp�d. F�rderung,�F�rderschwerpunkt Lernen, Abensberg Regensburger Stra�e 60 93326� Abensberg�  09443/709191 09443/709193 Berufsschulen zur sonderp�dog. F�rderung  www.berufsschule-abensberg.de 

在以下几行中,我添加了正确的字符,请以粗体查看一些更正!

lfd. Nr. Schul- nummer Schulname **Straße** PLZ Ort Telefon Fax Schulart Webseite
1 0401 **Mädchenrealschule** Marienburg, Abenberg, der **Diözese** Eichstätt Marienburg 1 91183 Abenberg  09178/509210  Realschulen  mrs-marienburg.homepage.t-online.de 
2 6581 Volksschule Abenberg (Grundschule) **Güssübelstr**. 2 91183 Abenberg 

以粗体查看一些更正......

那么我们如何重写正则表达式来解决特殊字符的问题...?

这里有任何提示....!?

顺便看一下代码:

sub processData() {
   while ( $range <= $total_records) {
      getstore("$url_to_process$suchbegriffe&a=$treffer&s=$range", 'processing.html') or die 'Unable to get page';
      $te->parse_file('processing.html');
      my ($table) = $te->tables;
      for my $row ( $table->rows ) {
         cleanup(@$row);
         print OUTFILE "@$row\n";
      }
      $| = 1;  
      print "Processed records $range to $counter";
      print "\r";
      $counter = $counter + 50;
      $range = $range + 50;
      $te = HTML::TableExtract->new;
   }
}

sub cleanup() {
   for ( @_ ) {
      s/\s+/ /g;
   }
}

【问题讨论】:

  • 使用区域设置; $| = 1; setlocale POSIX::LC_COLLATE, "de_DE"

标签: regex perl unicode special-characters


【解决方案1】:

问题不清楚,因为我在您的代码中没有看到任何正则表达式,除了 cleanup() 中的替换。这就是你认为导致你问题的原因吗?被破坏的“特殊”德语字符与 \s 模式不匹配,我非常怀疑这是否是罪魁祸首。

您的数据在输入和输出上均以 UTF-8 编码。但是输出文本用 EF BF BD 替换各种两字节字符,即 UTF-8 表示 Unicode U+FFFD 或“REPLACEMENT CHARACTER”。只要您以 UTF-8 格式打开所有文件,一切都应该没问题。我不相信在你的程序头部添加一个简单的use encoding 'UTF8' 并不能解决问题。

【讨论】:

  • 非常感谢您的出色和支持性回答。我会仔细看看代码! - 我周末晚些时候回来
【解决方案2】:

这与正则表达式无关。问题是您有编码问题。将所有内容标准化为 UTF-8,您会更快乐。

看在上帝的份上,不要使用 POSIX 语言环境!使用 UCA。

【讨论】:

    猜你喜欢
    • 2016-07-21
    • 1970-01-01
    • 2013-04-16
    • 2012-07-27
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 2016-02-11
    • 2013-03-13
    相关资源
    最近更新 更多