Regex 用于替换任何字符的Perl正则表达式

Regex 用于替换任何字符的Perl正则表达式,regex,perl,character,substitution,any,Regex,Perl,Character,Substitution,Any,本质上,我想把随机字符和k之间的u替换成o。我应该从替换中得到的输出是dudok和rujok 如何在Perl中实现这一点?我对Perl非常陌生,所以对我放松点 这就是我现在拥有的: $text = "duduk, rujuk"; $_ = $text; s/.uk/ok/g print $_; #Output: duok, ruok Expected: dudok, rujok 编辑:忘记提到最后一个音节是唯一应该更改的音节。另外,随机字符被特别地假定为随机辅音,而不仅仅是任何随机字符 我应该

本质上,我想把随机字符和k之间的u替换成o。我应该从替换中得到的输出是dudok和rujok

如何在Perl中实现这一点?我对Perl非常陌生,所以对我放松点

这就是我现在拥有的:

$text = "duduk, rujuk";
$_ = $text;
s/.uk/ok/g
print $_; #Output: duok, ruok Expected: dudok, rujok
编辑:忘记提到最后一个音节是唯一应该更改的音节。另外,随机字符被特别地假定为随机辅音,而不仅仅是任何随机字符

我应该提到的是,这一切都是基于马来语的字音转换规则。

将正则表达式更改为:

s/(.)uk/$1ok/g;
根据该报告,马来亚语使用一种无重音的拉丁字母,并且与英语有相同的辅音。然而,它的有向图不同于英语

  • ai元音
  • 元音
  • 元音
  • gh辅音
  • kh辅音
  • ng辅音
  • ny辅音
  • 辅音
因此,如果你想找到一个以
uk
结尾的音节,你可以寻找

<syllable_boundary>(?:[bcdfhjlmpqrtvwxyz]|gh?|kh?|n[gv]?|sv?)uk
<syllable_boundary>(?:[bcdfhjlmpqrtvwxyz]|gh?|kh?|n[gv]?|sv?)uk
[bcdfghjklmnpqrstvwxyz]uk
最后,我们可以使用
\b
检查单词的结尾,因此我们对匹配感兴趣

[bcdfghjklmnpqrstvwxyz]uk\b

现在,让我们用它来代替

s/([bcdfghjklmnpqrstvwxyz])uk\b/$1ok/g


最后一个是最有效的,但它需要Perl5.10+。(考虑到它有多古老,这不应该是一个问题。)

正如池上春树所提出的,“bukuk”一词将有两个替代词。这不是期望的结果,因为只有最后一个音节应该改变。此外,我忘了提到,改变只应该做一个随机辅音,u,然后是k(例如,ruk,而不是auk)

因此,考虑到已回答的所有问题,正确的正则表达式应为:

s/(\w*[bcdfghjklmnpqrstvwxyz])uk\b/$1ok/g;

编辑:ikegami再次提出,元音的补码-[^aeiou]将与其他字符匹配,如“-”和“”,这是不需要的。更新了解决方案。

很酷,效果非常好。非常感谢你!你能解释一下它在做什么吗?它是否将字符存储为问号,然后我们使用$1访问该问号?请在适当的条件下帮助我。哈哈夫纠正了一个明显的错误:)dukuk应该变成什么?dukuk会变成dukok,因为最后一个音节只应该改变。虽然dukuk不是一个真正的马来语单词!Hahaso rukuk->rukok,但alukan将保持不变?是的,你是对的。这是基于马来语规则。对不起,我没有详细说明问题中的最后一个音节规则。我现在就编辑它。如果你说“对不起,我没有详细说明问题中的最后一个音节规则”,我不是这么说的;我是说你没有检查最后一个音节的匹配。但这是错误的。我忽略了
\b
。抱歉,删除了否决票和评论。(以及修复这个问题的请求,现在还没有定论)啊,对了,因为我用的是元音补语。那么我将更新正则表达式。好吧,现在我对细微差别有了更好的理解,我决定接受你对这个问题的回答。非常感谢您的投入!更新以说明问题的主要变化。(@ysth)或者很简单,我们可以使用[^aeiou],它本质上是“非元音”,相当于“辅音”。对吗?那场比赛太激烈了。即使它是等效的,我怀疑它会更快
s/(?<=[bcdfghjklmnpqrstvwxyz])uk\b/ok/g
s/[bcdfghjklmnpqrstvwxyz]\Kuk\b/ok/g
s/(\w*[bcdfghjklmnpqrstvwxyz])uk\b/$1ok/g;