regex - 用于替换任何字符的 Perl 正则表达式
问题描述
本质上,我想将随机字符和 k 之间的 u 替换为 o。我应该从替换中得到的输出是 dudok 和 rujok。
我怎样才能在 Perl 中做到这一点?我对 Perl 很陌生,所以请放轻松。
这就是我现在所拥有的:
$text = "duduk, rujuk";
$_ = $text;
s/.uk/ok/g
print $_; #Output: duok, ruok Expected: dudok, rujok
编辑:忘了提到最后一个音节是唯一应该改变的。此外,随机字符特别应该是随机辅音,而不仅仅是任何随机字符。
我应该提一下,这都是基于马来语的字素到音素转换的规则。
解决方案
根据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+。(考虑到它的古老程度,这应该不是问题。)
推荐阅读
- php - 将多个图像路径插入多列
- java - Jira Rest Java 客户端:“403 Forbidden”错误
- javascript - 如何向 html5 视频播放器添加搜索滑块?
- python - 如何将包含多个值(它是一个元组)的标签提供给 keras 模型
- python - 如何避免 TypeError: '>' not supported between 'tuple' 和 'int' 实例?
- angular-dart - 为什么RouterLink 不会将您带到新页面的顶部,但当两者都编译为相同的HTML 时,常规的HTML 链接会?
- angularjs - 如何让 webpack 在新创建的目录中编译我新创建的文件
- javascript - 切换背景颜色类,但一次只有一个元素
- c - 如何在C中读取每行带有数字的文件?
- react-native - Redux 传奇:如何将 `yield put()` 放入事件监听器中?