如何用正则匹配每行所有空白分隔token均恰好出现两次的行?
正则匹配所有空白分隔token恰好出现两次的行
需求概述
需要编写正则表达式,匹配每行中所有以空白分隔的token都恰好出现两次的行,token顺序不限。
匹配的有效行:
1 1 2 2 100 10 10 100 A B B A HELLO HELLO
不匹配的无效行:
hello hello hello 1 1 22 1001
现有尝试的问题
你用(\d+)(?=.*(\1))只能匹配单个重复的数字token,但要覆盖整行时,前瞻会导致无限循环,而且这个正则仅针对数字,也无法保证所有token都恰好出现两次。
正则方案(局限性说明)
如果必须用正则实现,需要确保每行token总数为偶数,且每个token仅出现两次。以下是PCRE兼容的正则:
^(?:(\S+)(?:\s+\1)+(?!\s+\1))+$
⚠️ 注意:这个正则仅能匹配连续重复的token组合(比如A A B B),对于交叉排列的token(比如A B A B)无法正确匹配,而且很多SQL的正则引擎(如MySQL的REGEXP)不支持这类高级断言特性,实用性有限。
更可靠的SQL函数实现
正如你补充的,在SQL中用函数实现这个逻辑远比正则更简单、可靠。核心思路是分割token后统计每个token的出现次数,确保所有计数都是2:
以PostgreSQL为例:
SELECT line FROM your_table WHERE -- 检查所有token的出现次数都是2 (SELECT bool_and(token_count = 2) FROM ( SELECT token, COUNT(*) AS token_count FROM unnest(string_to_array(line, ' ')) AS token WHERE token != '' -- 过滤空token GROUP BY token ) AS token_stats) -- 额外确保token总数是偶数(避免单个token出现两次之外的异常情况) AND (SELECT COUNT(*) FROM unnest(string_to_array(line, ' ')) AS token WHERE token != '') % 2 = 0;
其他SQL方言可以用对应的字符串分割和统计函数实现类似逻辑,比如MySQL用JSON_TABLE分割字符串,SQL Server用STRING_SPLIT。
内容的提问来源于stack exchange,提问作者Ian Taylor
相关产品推荐
相关产品推荐

