JavaScript正则匹配首个元音前辅音实现Pig Latin问题求助
开头连续辅音匹配的正则写法说明
你现在卡壳的核心原因有两个:一是现有正则/^[^aeiou]/gi只能匹配开头的1个非元音字符,二是用split+filter逐字符校验的逻辑,天然会把字符串所有位置的非元音字符都筛出来——比如glove里元音o后面的v也是非元音,自然会被错误捞进结果,才会输出[ 'g', 'l', 'v' ]。
要实现「从字符串起始位置匹配连续辅音,碰到第一个元音就停止」的需求,直接用下面这个正则即可:
// 匹配字符串开头的连续非元音(辅音)段 const leadingConsonantReg = /^[^aeiou]+/i;
正则各部分的作用你可以对照理解,方便后续自己调整:
^锚定字符串起始位置,确保只从字符串最开头开始匹配,不会捞到中间、末尾位置的辅音[^aeiou]匹配非a/e/i/o/u的字符+代表匹配前面规则的字符1次及以上,贪婪匹配模式下会一直向后匹配,直到碰到第一个不符合规则的字符(也就是第一个元音)才终止,刚好匹配到完整的开头辅音段- 修饰符只保留
i(忽略大小写)即可,不需要加g(全局匹配):你当前加的g修饰符在这里反而会触发多次匹配的异常,毕竟你只需要提取开头的一段辅音,不需要全局查找所有匹配项。
使用的时候直接调用字符串的match方法就能拿到结果,比如执行"glove".match(leadingConsonantReg),返回的匹配结果就是['gl'],不会把后面的v错误匹配进来,符合你的预期。
顺便提个你现有元音判断函数里的明显bug,你后续调试的时候会碰到:你写的!str.charAt(0) == vowel是无效判断,正则对象不能直接和字符用==比较,要判断字符是否匹配正则,需要调用正则的test方法,比如vowel.test(str.charAt(0))才是正确的写法,剩下的移位、拼接后缀的逻辑你可以自己顺着实现,就不贴完整代码了。
内容的提问来源于stack exchange,提问作者dr3nan
相关产品推荐
相关产品推荐

