正则表达式,英语到猪拉丁语-如何确定大小写 不支持的转义序列解决方法

编辑:原始问题不在主题范围内,请进行修改以纠正问题。

我正在学习一些有关Elixir的编码挑战,并遇到了将英语翻译成Pig Latin on Wikipedia的问题。

我开始为不同的规则制定正则表达式,并意识到将所有内容合而为一并不难。玩了一点之后,我到达了以下内容,以一次匹配并转换一个单词。

Elixir应该使用与PCRE兼容的正则表达式,但是我还没有办法找到一种方法来使\u one character to upper\L All characters to lower在elixir中工作字符串替换。我已经尝试了几种将替换字符串工作的方法,但是完全没有找到一种可行的方法。

有没有办法在长生不老药String中使用纯正则表达式。替换它是否只需用常规代码处理其余部分?

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","\\1\\3\\2\\5\\4ay")
"irlSquay"

以下原始问题:

请注意,挑战是我完全说出以元音开头的单词,只是在结尾加上“ ay”。其他一些说明是“ way”或“ yay”

Powershell版本:

[Regex]$reg = '(^(?:[aeiou]|[xy][^aeiouy])(?:.*))|(?:^([^aeiou]*(?:u)?)([aeiouy].*))'
'powershell' -replace $reg,('$1$3$2' + 'ay')

Elixir版本:

regex = ~r/(^(?:[aeiou]|[xy][^aeiouy])(?:.*))|(?:^([^aeiou]*(?:u)?)([aeiouy].*))/i
String.replace("elixir","\\1\\3\\2ay")

这似乎很容易,我是否缺少这种情况?

Venus0808 回答:正则表达式,英语到猪拉丁语-如何确定大小写 不支持的转义序列解决方法

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

  

该库的匹配算法基于PCRE库,但并非所有PCRE库都已接口

然后:

  

不支持的转义序列

     

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


解决方法

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

本文链接:https://www.f2er.com/3120404.html

大家都在问