用于替换任何字符的 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] 将匹配其他字符,如“-”和“”,这是不需要的。更新了解决方案。
本质上,我想将随机字符和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] 将匹配其他字符,如“-”和“”,这是不需要的。更新了解决方案。