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

Perl Regex for Substituting Any Character

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

我如何在 Perl 中执行此操作?我是 Perl 的新手,请放轻松。

这是我现在拥有的:

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

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

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

将您的正则表达式更改为:

s/(.)uk/ok/g;

根据this page,马来亚语使用不重读的拉丁字母,与英语有相同的辅音。但是,它的二合字母与英文的不同。

  • ai元音
  • 非元音
  • oi 元音
  • gh 辅音
  • kh 辅音
  • ng 辅音
  • 纽约辅音
  • sy 辅音

因此,如果要查找以 uk 结尾的音节,则应查找

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

<syllable_boundary>uk

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

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

所以现在,我们必须确定如何找到音节边界。 ...或者我们呢?所有的辅音二合字母都以辅音结尾,元音二合字母的 none 以辅音结尾,所以我们只需要寻找

[bcdfghjklmnpqrstvwxyz]uk

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

[bcdfghjklmnpqrstvwxyz]uk\b

现在,让我们用它来代替。

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

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

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

最后一种效率最高,但需要 Perl 5.10+。 (考虑到它有多古老,这应该不是问题。)

正如 ikegami 提出的那样,"bukuk" 一词将有两个替换项。这不是期望的结果,因为只应更改最后一个音节。另外,我忘了提及更改应该只针对随机辅音 u,然后是 k(例如 ruk,而不是 auk)。

因此,考虑到已回答的所有内容,正确的正则表达式应该是:

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

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