You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则匹配每行所有空白分隔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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 09:05:16