如何实现Reddit标题需从多组选项各选一项的验证规则
解决Reddit标题多组选项必选的正则方案
问题核心
你之前的多组正则是逻辑或关系(满足任意一组即可),所以用户只需选单组选项就能通过验证。要实现「从每组各选一个」的要求,需要把多组选项的组合规则整合到同一个正则里,确保标题开头的方括号内同时包含不同组的选项。
具体实现方案
假设你的分组规则如下(可根据实际需求调整):
- 组1:
asdasa、osdff - 组2:
yysjdj、sdgasdg - 组3:
hofkhm、xyz
场景1:必须选所有组的各一个(顺序固定)
如果要求选项严格按组1→组2→组3的顺序排列,用分隔符(比如-,可替换为空格、逗号等)连接,正则写法:
^\[(asdasa|osdff)-(yysjdj|sdgasdg)-(hofkhm|xyz)\] .*
^\[匹配标题开头的左方括号(asdasa|osdff)匹配组1的任意选项-是选项之间的分隔符(可根据社区规则修改).*匹配标题剩余内容,确保整个标题以合规的方括号开头
场景2:必须选所有组的各一个(顺序任意)
如果允许选项顺序自由调整,需要枚举所有合法的顺序组合:
^\[(?:(asdasa|osdff)-(yysjdj|sdgasdg)-(hofkhm|xyz)|(asdasa|osdff)-(hofkhm|xyz)-(yysjdj|sdgasdg)|(yysjdj|sdgasdg)-(asdasa|osdff)-(hofkhm|xyz)|(yysjdj|sdgasdg)-(hofkhm|xyz)-(asdasa|osdff)|(hofkhm|xyz)-(asdasa|osdff)-(yysjdj|sdgasdg)|(hofkhm|xyz)-(yysjdj|sdgasdg)-(asdasa|osdff))\] .*
(?:...)是非捕获分组,用于包裹不同顺序的组合,避免生成多余的捕获组
场景3:至少选两个不同组的各一个
如果不需要选全所有组,只需从任意两组各选一个,枚举所有合法的组组合即可:
^\[(?:(asdasa|osdff)-(yysjdj|sdgasdg)|(asdasa|osdff)-(hofkhm|xyz)|(yysjdj|sdgasdg)-(hofkhm|xyz))\] .*
关键说明
- 方括号
[]在正则中是特殊字符,必须用\[和\]转义,才能匹配标题里的实际方括号 - 分隔符可根据社区习惯修改,比如换成
,(逗号加空格),只需把正则里的-替换成,即可 - 如果需要支持更多组,只需按相同逻辑扩展分组和组合规则
内容的提问来源于stack exchange,提问作者Micz
相关产品推荐
相关产品推荐

