【发布时间】:2020-03-07 16:54:04
【问题描述】:
编辑:原始问题偏离主题,正在编辑以更正。
我正在解决一些学习 Elixir 的编码挑战,并遇到了一个将英语翻译成 Pig Latin on Wikipedia 的挑战。
我开始为不同的规则制定正则表达式,并意识到一体完成这一切并不难。在玩了一点之后,我得出了以下结果,一次匹配和转换一个单词。
Elixir 应该使用与 PCRE 兼容的正则表达式,但我无法找到一种方法来让 \u one character to upper 和 \L All characters to lower 在 Elixir 字符串替换中工作。我已经尝试了几种将它们转换为替换字符串的变体,但完全没有找到可行的方法。
有没有办法在 elixir String.replace 中使用纯正则表达式,我需要在常规代码中处理其余部分吗?
iex(21)> regex = ~r/(^(?:[aeiouAEIOU]|[XYxy][^aeiouy])(?:.*))|(?:^([A-Z][^aeiou]*(?:u)?)([aeiouy].*))|(?:^([^aeiou]*(?:u)?)([aeiouy].*))/
~r/(^(?:[aeiouAEIOU]|[XYxy][^aeiouy])(?:.*))|(?:^([A-Z][^aeiou]*(?:u)?)([aeiouy].*))|(?:^([^aeiou]*(?:u)?)([aeiouy].*))/
iex(22)> String.replace("Squirl", regex, "\\1\\u\\3\\L2\\5\\4ay")
"\\uirl\\L2ay"
iex(23)> String.replace("Squirl", regex, "\\1\\3\\2\\5\\4ay")
"irlSquay"
原始问题如下:
请注意,我所面临的挑战完全是以元音开头的单词,只需在末尾附加“ay”即可。其他一些说明说“方式”或“耶”
Powershell 版本:
[Regex]$reg = '(^(?:[aeiou]|[xy][^aeiouy])(?:.*))|(?:^([^aeiou]*(?:u)?)([aeiouy].*))'
'powershell' -replace $reg, ('$1$3$2' + 'ay')
灵药版本:
regex = ~r/(^(?:[aeiou]|[xy][^aeiouy])(?:.*))|(?:^([^aeiou]*(?:u)?)([aeiouy].*))/i
String.replace("elixir", regex, "\\1\\3\\2ay")
这似乎很容易,有没有我遗漏的案例?
【问题讨论】:
-
Latin转到Atinlay而不是atinLay;yule转到yuleay和honest转到honestay(但happy转到appyhay) -
嗯,我还没有在正则表达式中改变大小写,这听起来像是一个有趣的挑战。有没有办法找出像 yule 和诚实这样的词,而无需通过字典查找来查找音标?
-
例如,您缺少“天真”。另外,这是本站的一个题外话,你最好把它贴在codereview.stackexchange.com 或类似的地方。
-
@AlekseiMatiushkin 感谢您的评论,我没有意识到有一个代码审查网站。不过我不确定如何移动帖子。