相关疑难解决方法(0)

正则表达式以匹配不同Unicode脚本之间的边界

正则表达式引擎具有"零宽度"匹配的概念,其中一些对于查找单词边缘很有用:

  • \b - 存在于大多数引擎中以匹配单词和非单词字符之间的任何边界
  • \<\>- 并且- 在Vim中仅分别匹配单词开头的边界和单词的结尾处的边界.

一些正则表达式引擎中的新概念是Unicode类.一个这样的类是脚本,可以区分拉丁语,希腊语,西里尔语等.这些例子都是等价的,匹配希腊语书写系统的任何字符:

  • \p{greek}
  • \p{script=greek}
  • \p{script:greek}
  • [:script=greek:]
  • [:script:greek:]

但到目前为止,在我阅读正则表达式和Unicode的来源时,我还无法确定是否有任何标准或非标准方法来实现零宽度匹配,其中一个脚本结束而另一个脚本开始.

在串????会有的之间的匹配??人物,就如同\b\<会只是之前匹配?字符.

现在,对于这个例子,我可以根据寻找\p{Greek}后面的\p{Han}东西一起破解,我甚至可以根据两个Unicode脚本名称的所有可能组合来一起破解.

但这不是一个确定性的解决方案,因为每个版本仍然会在Unicode中添加新脚本.是否有一种面向未来的方式来表达这一点?或者是否有建议添加它?

regex unicode word-boundary word-boundaries character-properties

8
推荐指数
1
解决办法
679
查看次数

为什么单词字符(\ w)在使用locale pragma下不匹配?

当我use locale,我的语言环境(et_EE.UTF-8)中的一些字符与之匹配时\w,我没有看到任何理由.

除了ASCII之外,爱沙尼亚还使用了六个字符:

õäöüšž

在我下面的测试脚本中,我使用$string了三个额外的特殊字符ð??(不属于爱沙尼亚字母).

use feature 'say';
use POSIX qw( locale_h );

{
  use utf8;
  my  $string = "õäöüšž ð??";
  binmode STDOUT, ":encoding(UTF-8)";
  say "nothing";
  say 'LOCALE: ', setlocale(LC_CTYPE), ' ', setlocale(LC_COLLATE);
  say 'UC: ', uc( $string );
  say 'SORT: ', sort( split(//, $string) );
  say $string =~ m/\w/g;
  say $string =~ m/\p{Word}/g;
  say '';
}

{
  use utf8;
  use locale;
  binmode STDOUT, ":encoding(UTF-8)";
  my  $string = "õäöüšž ð??";
  say "locale"; …
Run Code Online (Sandbox Code Playgroud)

sorting unicode perl locale utf-8

1
推荐指数
1
解决办法
272
查看次数