【问题标题】:Regex, English to Pig Latin - how to fix capitalization正则表达式,英语到猪拉丁语 - 如何修复大写
【发布时间】: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 而不是atinLayyule 转到 yuleayhonest 转到 honestay(但 happy 转到 appyhay
  • 嗯,我还没有在正则表达式中改变大小写,这听起来像是一个有趣的挑战。有没有办法找出像 yule 和诚实这样的词,而无需通过字典查找来查找音标?
  • 例如,您缺少“天真”。另外,这是本站的一个题外话,你最好把它贴在codereview.stackexchange.com 或类似的地方。
  • @AlekseiMatiushkin 感谢您的评论,我没有意识到有一个代码审查网站。不过我不确定如何移动帖子。

标签: regex elixir pcre


【解决方案1】:

elixir regex 文档中,您可以看到它基于erlang 的:re,其中明确指出:

库的匹配算法是基于PCRE库的,但并不是所有的PCRE库都有接口

然后:

不支持的转义序列

在 Perl 中,序列 \l、\L、\u 和 \U 被其字符串处理程序识别并用于修改后面字符的大小写。 PCRE 不支持这些转义序列。


解决方法

您必须将String.replace 与“接收匹配模式并且必须以字符串或iodata 形式返回替换的函数”一起使用作为replacement(第三个)参数。

【讨论】:

  • 好吧,有道理,抱歉我不知道去哪里追查这些内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多