首页 > 解决方案 > 用于替换任何字符的 Perl 正则表达式

问题描述

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

我怎样才能在 Perl 中做到这一点?我对 Perl 很陌生,所以请放轻松。

这就是我现在所拥有的:

$text = "duduk, rujuk";
$_ = $text;
s/.uk/ok/g
print $_; #Output: duok, ruok Expected: dudok, rujok

编辑:忘了提到最后一个音节是唯一应该改变的。此外,随机字符特别应该是随机辅音,而不仅仅是任何随机字符。

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

标签: regexperlcharactersubstitutionany

解决方案


根据this page,马来亚语使用无重音拉丁字母,并且与英语具有相同的辅音。但是,它的有向图与英语的不同。

  • ai 元音
  • 元音
  • oi 元音
  • gh辅音
  • kh辅音
  • ng辅音
  • ny辅音
  • sy辅音

所以,如果你想找到一个以 结尾的音节uk,你会寻找

<syllable_boundary>(?:[bcdfhjlmpqrtvwxyz]|gh?|kh?|n[gv]?|sv?)uk

或者

<syllable_boundary>uk

OP 对后者特别不感兴趣,所以我们只需要寻找

<syllable_boundary>(?:[bcdfhjlmpqrtvwxyz]|gh?|kh?|n[gv]?|sv?)uk

所以现在,我们必须确定如何找到音节边界。...还是我们?所有的辅音二合字母都以辅音结尾,并且没有一个元音二合字母以辅音结尾,所以我们只需要寻找

[bcdfghjklmnpqrstvwxyz]uk

最后,我们可以使用\b来检查单词的结尾,所以我们有兴趣匹配

[bcdfghjklmnpqrstvwxyz]uk\b

现在,让我们在替换中使用它。

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

或者

s/(?<=[bcdfghjklmnpqrstvwxyz])uk\b/ok/g

或者

s/[bcdfghjklmnpqrstvwxyz]\Kuk\b/ok/g

最后一个是最有效的,但它需要 Perl 5.10+。(考虑到它的古老程度,这应该不是问题。)


推荐阅读