如何用正则表达式反向引用查找含三个及以上相同元音的单词?
问题解析与解决
核心原因
你最初用.*?时出现错误匹配,本质是.*?和\w*的匹配范围差异:
.*?是非贪婪的任意字符匹配,它会匹配包括制表符在内的所有字符,这就导致正则会跨越第一列(单词列),匹配到后面PoS/Lemma列里的元音。比如单词列只有1个a,但第二列里有两个a,正则会跨列凑够三个a,让你误以为匹配到了单词里有三个不同元音的情况。\w*是贪婪的单词字符匹配,在Perl正则(ggrep -P)中,\w只匹配字母、数字和下划线,不包含制表符,所以它被限制在第一列(单词列)内,只会匹配单词本身的字符,确保三个\1反向引用的元音都来自同一个单词,不会跨列乱匹配。
补充说明
你的正则里的反向引用\1本身是正确的,它确实会严格引用第一个括号里匹配到的元音。之前的错误完全是因为.*?的匹配范围不受限,跨列导致的误判。
内容的提问来源于stack exchange,提问作者sgelena
相关产品推荐
相关产品推荐

