使用JS正则验证Google表格/Excel相对范围字符串
验证Google表格/Excel相对范围字符串的JavaScript实现
需求规则
- 包含
$符号的范围判定为无效; - 除冒号
:外,包含其他非允许字符的范围判定为无效; - 允许使用的字符为大小写英文字母(A-Z/a-z)和0-9数字,同时需满足格式要求:
- 行号需从1开始,不能以0开头;
- 单个单元格必须是「字母列+数字行」的完整组合(仅字母或仅数字均无效);
- 范围格式需为「合法片段:合法片段」,片段可为仅列、仅合法行、完整单元格,且首尾片段均不能为空。
预期验证结果
- A0 // 无效(行号以0开头)
- ZZ12 // 有效
- ZZ12: // 无效(终止片段为空)
- :A11 // 无效(起始片段为空)
- :1 // 无效(起始片段为空)
- :A // 无效(起始片段为空)
- A1 // 有效
- B1 // 有效
- A2 // 有效
- C:F // 有效
- A10:B10 // 有效
- A:B10 // 有效
- A10:B // 有效
- A:B // 有效
- 10:10 // 有效
- AA1 // 有效
- AAA1 // 有效
- B9:B10 // 有效
- A // 无效(仅列,非完整单元格)
- 1 // 无效(仅行,非完整单元格)
- B // 无效(仅列,非完整单元格)
- 20 // 无效(仅行,非完整单元格)
- @ // 无效(包含非法字符)
// 无效(包含非法字符)
现有代码问题
你尝试的正则/^[A-Z]?[0-9]?:[A-Z]?[0-9]?$/过于简化,无法覆盖多字母列名(如AA、AAA)、多位数字行号,也未处理行号不能以0开头、单个单元格格式限制、范围片段不能为空等核心规则,导致验证结果不符合预期。
正确实现方案
以下是满足所有规则的JavaScript函数:
const isValidRange = (str) => { // 检查是否包含$或其他非法字符(仅允许字母、数字、冒号) if (/[$]|[^A-Za-z0-9:]/.test(str)) return false; // 定义合法的范围片段:仅列、仅合法行(非0开头)、完整单元格 const validSegment = /^(?:[A-Za-z]+|[1-9]\d*|[A-Za-z]+[1-9]\d*)$/; const parts = str.split(':'); // 单个单元格的情况:必须是字母+非0开头的数字组合 if (parts.length === 1) { return /^[A-Za-z]+[1-9]\d*$/.test(parts[0]); } // 范围的情况:必须是两个非空的合法片段 if (parts.length === 2) { const [start, end] = parts; return start && end && validSegment.test(start) && validSegment.test(end); } // 包含多个冒号的情况直接无效 return false; };
测试验证
将测试用例传入函数,可得到符合预期的结果:
const testCases = ["A0","ZZ12","ZZ12:",":A11",":1",":A","A1","B1","A2","C:F","A10:B10","A:B10","A10:B","A:B","10:10","AA1","AAA1","B9:B10","A","1","B","20","@","##"]; testCases.forEach(item => { console.log(`${item} --- ${isValidRange(item) ? '有效' : '无效'}`); });
输出结果:
A0 --- 无效 ZZ12 --- 有效 ZZ12: --- 无效 :A11 --- 无效 :1 --- 无效 :A --- 无效 A1 --- 有效 B1 --- 有效 A2 --- 有效 C:F --- 有效 A10:B10 --- 有效 A:B10 --- 有效 A10:B --- 有效 A:B --- 有效 10:10 --- 有效 AA1 --- 有效 AAA1 --- 有效 B9:B10 --- 有效 A --- 无效 1 --- 无效 B --- 无效 20 --- 无效 @ --- 无效 ## --- 无效
内容的提问来源于stack exchange,提问作者Code Guy
相关产品推荐
相关产品推荐

