成功匹配3个不同元音字母的正则表达式

6

我正在尝试编写一个正则表达式,以匹配连续出现3个或更多不同的元音字母。 我知道如何编写一个正则表达式来搜索3个相同的元音字母。

/([aeuioy])\\1{2,}/

关于这个问题,大概有三种不同的思路...你有什么想法吗?

请帮我解决这个问题!实际上我脑子里一片空白。


我相当确定这不能使用正则表达式完成。 - d'alar'cop
当然可以!反向引用可以在字符类中工作,某些正则表达式变体支持字符类的减法。这只取决于你的口味。楼主,你需要哪种正则表达式的口味? - Adam Smith
Mikhail,你的表达方式看起来有点不同于我的,但它的作用是相同的! - Jongware
1
@AdamSmith:“回溯引用在字符类内部无效”:这是错误的。 - Casimir et Hippolyte
三个元音字母必须连续吗?abcdefhij 是有效的吗? - Toto
显示剩余3条评论
4个回答

12

查找 3 个连续的元音字母。将第一个字母进行分组。在第一个字母之后,使用负向预查来检查它是否不是 #1。通过该测试后,捕获下一个字符。然后使用 两个 负向预查,一个用于检查它是否不是 #1,另一个用于检查它是否不是 #2。

后面的步骤可以将其 OR 合并为单个预查。

(?=[aeouiy]{3})(.)(?!\1)(.)(?!\1|\2).

你不需要对最后一个字符进行测试。第一个 Lookahead 确保它是 aeouiy 中的一个;第三个负向 Lookahead 确保它既不是第一个字符也不是第二个字符。


1
OP写道“3个或更多个不同的元音字母连续出现”,我认为这并不意味着三个元音字母连续出现。(但是,OP应该提供一些示例来澄清) - anubhava

6

虽然这不一定是最实用的选择,但到目前为止,这是唯一一个“真正”的正则表达式:

(iea|oea|uea|yea|eia|oia|uia|yia|eoa|ioa|uoa|yoa|eua|iua|oua|yua|eya|iya|oya|uya|iae|oae|uae|yae|aie|oie|uie|yie|aoe|ioe|uoe|yoe|aue|iue|oue|yue|aye|iye|oye|uye|eai|oai|uai|yai|aei|oei|uei|yei|aoi|eoi|uoi|yoi|aui|eui|oui|yui|ayi|eyi|oyi|uyi|eao|iao|uao|yao|aeo|ieo|ueo|yeo|aio|eio|uio|yio|auo|euo|iuo|yuo|ayo|eyo|iyo|uyo|eau|iau|oau|yau|aeu|ieu|oeu|yeu|aiu|eiu|oiu|yiu|aou|eou|iou|you|ayu|eyu|iyu|oyu|eay|iay|oay|uay|aey|iey|oey|uey|aiy|eiy|oiy|uiy|aoy|eoy|ioy|uoy|auy|euy|iuy|ouy)

3
您可以使用基于前瞻的正则表达式来实现此功能:
^(?:[^aeiou]*([aeiou])(?!.*?\1)){3}

正则表达式演示

更新:如果OP希望每行至少有三个不同的元音字母连续出现,那么请使用上述正则表达式的简化版本:

(?:([aeiou])(?!.{1,2}\1)){3}

新正则表达式演示


我最初对此进行了负评,因为我认为它会通过“aXXXeXXXa”,但实际上并没有。我仍然不知道它为什么不能通过,但它确实无法通过。话虽如此,我认为OP想要匹配的是“aei”而不是“aXXXeXXXi”,但这相当模糊不清。 - Adam Smith
是的,一些来自OP的例子会更好地澄清问题。我理解为任何至少有3个不同元音字母的输入行都是匹配的。 - anubhava
@anubhava OP使用“in a row”这个短语,它是英语中的一个习语,意思是“连续不间断地”。 - trooper
@trooper:感谢您的评论。row也可以被解释为一行。话虽如此,我的正则表达式对于这个要求仍然有效,正如您从这个演示中看到的 - anubhava

1
任何你想要的东西都是元音字母之间的全排列,因此你可以使用以下内容:
(?=[aeouiy]{3}$)(?!.*(.).*\1).*$

(?!.*(.).*\1) 的作用是确保无法匹配重复的字符!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接