【问题标题】:Perl Regex for Substituting Any Character用于替换任何字符的 Perl 正则表达式
【发布时间】:2020-04-18 14:48:29
【问题描述】:

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

如何在 Perl 中做到这一点?我对 Perl 很陌生,所以请放轻松。

这就是我现在拥有的:

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

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

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

【问题讨论】:

  • dukuk 应该变成什么?
  • dukuk 会变成 dukok,因为最后一个音节应该只改变。虽然 dukuk 不是真正的马来语单词!哈哈
  • so rukuk -> rukok 但 alukan 会保持不变?
  • 是的,你是对的。

标签: regex perl character substitution any


【解决方案1】:

根据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

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

[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+。 (考虑到它的古老程度,这应该不是问题。)

【讨论】:

  • 已更新以说明问题的主要变化。 (@ysth)
  • 或者很简单,我们可以使用 [^aeiou],它本质上是“非元音”,相当于“辅音”。对吗?
  • 匹配的太多了。即使它是等效的,我怀疑它会更快
【解决方案2】:

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

s/(.)uk/$1ok/g;

【讨论】:

  • 酷,效果很好。太感谢了!你能解释一下它在做什么吗?是否将字符存储到问号中,然后我们用 $1 访问该问号?请以适当的条件帮助我。哈哈
  • 修正了明显的错误:)
【解决方案3】:

正如 ikegami 提出的,“bukuk”这个词有两个替换。这不是预期的结果,因为只有最后一个音节应该改变。另外,我忘了说只能对随机辅音 u 进行更改,然后是 k(例如 ruk,而不是 auk)。

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

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

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

【讨论】:

  • 这是基于马来语规则的。抱歉,我没有指定问题中的最后一个音节规则。我现在将其编辑。
  • Re "对不起,我没有具体说明问题中的最后一个音节规则。",这不是我的意思;我是说你没有检查匹配是否在最后一个音节中。但这是错误的。我忽略了\b。抱歉,已删除投票和评论。 (以及解决问题的请求,现在没有实际意义)
  • 嗯,对,因为我使用的是元音补码。然后将更新正则表达式。
  • 好吧,现在我对细微差别有了更好的理解,我决定接受你对这个问题的回答。非常感谢您的意见!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多