正则表达式引擎具有"零宽度"匹配的概念,其中一些对于查找单词边缘很有用:
\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
当我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"; …