阅读 29

判断单词的大写使用是否正确

定义在以下情况时,单词的大写用法是正确的:

  • 单词所有字母都是大写,比如: "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.