定义在以下情况时,单词的大写用法是正确的:
- 单词所有字母都是大写,比如: "USA"
- 单词所有字母都是小写,比如: "hello"
- 单词首字母大写, 比如: "Google"
- 否则,这个单词没有正确使用大写字母
正则表达式
/(^[A-Z]+$)|(^[A-Z]?[a-z]*$)/
复制代码
测试
const reg = /(^[A-Z]+$)|(^[A-Z]?[a-z]*$)/;
reg.test('USA'); // true
reg.test('hello'); // true
reg.test('Google'); // true
reg.test('HEllo'); // false
reg.test('HELlo'); // false
reg.test('HelloWorld'); // false
复制代码
⚠️Tip:
使用正则全局匹配 g
时需注意, 例如: /(^[A-Z]+$)|(^[A-Z]?[a-z]*$)/g
.
原因
正则表达式若设置了全局匹配, 则该正则表达式的 lastIndex
属性会在匹配时变化如下:
- 匹配成功:
lastIndex
属性值会被设置为 匹配成功的子字符串的最后一个字符, 在原字符串中的索引值再加1. 若再次利用该正则对字符串进行匹配, 它以lastIndex
属性值作为匹配的起点, 先后进行匹配. - 匹配失败:
lastIndex
属性值会被设置为0.
解决办法
- 方式一: 不设置正则的全局匹配
g
- 方式二: 若正则必须使用全局匹配, 在每一次匹配之后, 手动将正则的
lastIndex
属性值设置为0.