如何使用正则表达式执行分支逻辑(特别是,删除'w'除非后跟元音)



我是正则表达式的新手,我正试图在vb.net中实现变音算法。http://en.wikipedia.org/wiki/Metaphone

该算法有很多步骤来根据特定条件替换字符。(例如,替换w,除非后面跟着元音)。是否有一种方法来处理分支逻辑使用正则表达式?

I tried

 output = Regex.Replace(input, "w[^aeiou]", "")

但是这也删除了w后面的字符。输入= well ->输出=we(目标是well)

我可以遍历字符串中的字符来解决这个问题,但我想尝试正确/最有效地做到这一点,而不是仅仅制造出笨重的代码。

替换w和元音的原因是replace将替换整个匹配,并且正则表达式也匹配元音。

你想要使用的是负向前看,这应该匹配w后面跟着一个元音,但不会消耗元音,因此不包括它在你的匹配和替换。所以试试像w(?![aeiou])

这样的正则表达式

在这个正则表达式中,(?!是负正向的。这里有一个很棒的网站,详细介绍:

你的例子可以使用

 output = Regex.Replace(input, "w([^aeiou])", "$1")

我不能告诉你这是否是最有效的方法,但是看看维基百科上的替换页面,像这样工作应该是有效的。

说明:圆括号定义了一个组,反向引用$1-$9允许你在替换中使用部分匹配。您可以在http://www.regular-expressions.info/brackets.html

上获得有关反向引用的更多信息。

最新更新