如何在 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']
我正在解决一个长生不老药问题,其中有一个短语:
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']