如何在 String.split 中使用正则表达式而不拆分国际字符?

How do I use regex within a String.split without splitting on international characters?

我正在解决一个长生不老药问题,其中有一个短语:

phrase = "duck duck goose more_ducks hyphenated-duck überduck"

我试图将这个字符串拆分成一个单词列表,其中带下划线的单词是单独的单词,带连字符的单词不是。以下代码对我有用:

String.split(phrase, ~r{([^\w'-]+|_)})

除了元音变音字符,它将单词分开。 我希望它不要在国际字符上分裂,但看不到找到可行的方法。

我尝试了 ^p{Ll}$/u 的几种排列,最新的是:

String.split(~r{[^\w'-]+/^\p{L}/u|_})

在我的阅读资料中,我也没能找出 /u 之前的 '$' 的用途,但它出现在很多例子中。无论我将它放在正则表达式部分的什么位置,我似乎都会遇到某种排序或错误。

任何见解或帮助将不胜感激。我觉得我缺少一些基本的东西。

提前致谢

更新:评论中的一个见解给了我一个解决方案和对我的问题的解释。 “u”正在修改 ~r{} 印记。当我把“u”放在正确的位置时,它工作正常:

String.split(~r{([^\w'-]+|_)}u)

这里用Regex.scan/3更自然。您需要将正则表达式显式设置为 unicode(u 修饰符为 ~r// sigil)并匹配后续字母的序列 and/or 破折号。

Regex.scan ~r/[\p{L}'’-]+/u, phrase
#⇒ [
#    ["duck"],
#    ["duck"],
#    ["goose"],
#    ["more"],
#    ["ducks"],
#    ["hyphenated-duck"],
#    ["überduck"]
#  ]

旁注:

German character

Umlaut 绝不是“德语字符”,它是所谓的 combining diacritical mark,名为 diaeresis,在德语以外的许多语言中使用。例如,参见英文单词 naïve,或法国公司 Citroën

您根本不需要使用正则表达式:

String.split(phrase, [" ", "_"])

输出:

["duck", "duck", "goose", "more", "ducks", "hyphenated-duck", "überduck"]

正则表达式可能有些难以阅读。将 xr 包装器用于 Python 的正则表达式会容易得多。

% pip install xr
% python
Python 3.8.5 (default, Jul 21 2020, 10:48:26)
...
>>> from xr import Text
>>> Text(' ').split('a b c')
['a', 'b', 'c']

xr 还为这个用例提供了一些语法糖:

WhiteSpace.split('a b c d')

无论如何,您可能有兴趣知道我刚刚将您的 duck duck goose 示例字符串添加到 xd 的单元测试中。

>>> WhiteSpace.split("duck duck goose more_ducks hyphenated-duck überduck")
['duck', 'duck', 'goose', 'more_ducks', 'hyphenated-duck', 'überduck']