Regular Expression 正规表达式

JavaScript 正规表达式 Regular Expression 的文本处理工具,通常是由特殊字符和普通字符组成的模式,用来描述需要匹配的文本。可以用来 search 搜索、replace 替换、分割 split 和验证字符串。正规表达式通常是由特殊字符和普通字符组成的模式,用来描述需要匹配的文本。在 JavaScript 中可以使用 RegExp 对象来创建正规表达式并使用 JavaScript String 对象的 matchsearchreplace 替换字符串和 split 方法来分割字符串,对 String 字符串进行操作。

let value = document.getElementById("input").value;
let regex = /^[A-Za-z]+$/;
let result = regex.test(value);
console.log(result);

RegExp 比对文字模式的方法 test() 对输入字串加以处理,寻找符合表达式规则的子字串。
正则表达式「符合规则时」传回 true;没有符合时传回 false。


线上 JavaScript 正规式测试验证

浏览器通用的正规表示式 Regular Expression 语法整理,正则表达式的基本概念、对于数字验证、信箱、手机号码、字符串验证、数字长度范围和英文字母、密码验证、中文、日文、韩文、特殊符号全域匹配方式。

验证由 26 个英文字母组成的字串(大写及小写),^ 文字的开始位置。$ 文字行的尾端。

/^[A-Za-z]+$/
/^[A-Z]+$/i

验证只能输入 3 个数字,限制字串长度。

/^\d{3}$/

验证只能输入 3~6 个数字,限制字串长度范围。

/^\d{3,6}$/

验证输入需 6~10 个由英文字母(大写或小写)或数字混合。但 [A-Z0-9] 所以全英文 AAAAAA 或全数字 111111 是符合的。

/^[A-Z0-9]{6,10}$/i

验证密码输入需 6~10 个由至少有一个数字、至少有一个小写英文字母、至少有一个大写英文字母。但包括了 \W 不属于英文大小写字母、数字及底线外的字。

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{6,10}$/

验证密码输入需 6~10 个由至少有一个数字、至少有一个小写英文字母、至少有一个大写英文字母。至少有一个「特殊符号」。

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*\W).{6,10}$/

至少有一个「规定的 [#$%*] 特殊符号」但需要预先处理掉其他的特殊符号。

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[#$%*]).{6,10}$/

\W 特殊符号中的一部份

  1. "
  2. #
  3. $
  4. %
  5. &
  6. '
  7. (
  8. )
  9. *
  10. +
  11. ,
  12. .
  13. /
  14. :
  15. ;
  16. <
  17. =
  18. >
  19. ?
  20. @
  21. [
  22. ]
  23. ^
  24. `
  25. {
  26. |
  27. }
  28. ~
  29. -

验证手机号码,仅验证格式,当使用单一栏位时加入 ^ 文字的开始位置。$ 文字行的尾端。若于本文情况如 match 就不需要了。

/^09\d{2}-\d{6}$/

使用 match 进行规则运算式全域匹配

let eTextarea = document.querySelector("textarea").value;
let regEx = /[\u3041-\u30FF]+/g;
let result = eTextarea.match(regEx);
console.log(result);
-

匹配「表单栏位」中的手机号码格式。

/09\d{2}-\d{6}/


匹配中文简繁体字,范围有 20,992 字。注意里面有些属于表示部首的并不包括,日文汉字则符合。

/[\u4E00-\u9FFF]+/g


匹配康熙部首,范围有 214 字用于表示部首的字符。

/[\u2F00-\u2FD5]+/g


匹配注音扩展

/[\u3105-\u312F]+/g


匹配全形字(包含中文、日文、韩文、特殊符号)

/[^\x00-\xff]+/g


匹配日文(不包含日文汉字)

/[\u3041-\u30FF]+/g

/[\u3040-\u309F]+/g  // 平假名
/[\u30A0-\u30FF]+/g  // 片假名

匹配韩文,范围有 11,172 字,但是无法分辨是否正确。

/[\uAC00-\uD7A3]+/g

用四个十六进位数位表示的 Unicode 字元。

Unicode 区段以参考维基百科,区段被定义为一组连续码位的范围。区段会被给予唯一的名称,且区段与区段间不会重叠。再依照更细的范围匹配需要的文字。全形符号、「直式」标点符号、半角符号、全角符号等。

zh.wikipedia.org Unicode 区段


RegExp 包裹起来内的文字

var wrapTxt = "ABC-ABC[XYZ]001 56789"
var wrapReg = /\[.*\]/;
wrapReg.test(wrapTxt);   // true
wrapTxt.match(wrapReg);  // [XYZ]
wrapTxt.replace(wrapReg, " ## ");  // ABC-ABC ## 001 56789


身分证字号

身分证字号,仅验证格式无验算公式。第一个英文字母县市代码、第二个表示性别,男 = 1、女 = 2 接着 \d{8} 数字编号。

/^[A-Z](1|2)\d{8}$/


加入 JavaScript 身分证字号验算公式

A123456789

第一个英文字母 (A) 县市代码表示县市代码(由字母对照中取得 2 位的数字编号,分别用 L1 和 L2 表示)
第二个数字 (S) 表示性别,男 = 1、女 = 2
第三个数字到第十个数字,流水号分别以 D1、D3.....D8 表示。

V = L1×1 + L2×9 + S×8 + D1×7 + D2×6 + D3×5 + D4×4 + D5×3 + D6×2 + D7×1 + D8×1

假如 V 能被 10 整除,则表示身分证统一编号正确。

function Validation() {
  var codeString = document.getElementById("INPUT").value;
  if (/^[A-Z](1|2)\d{8}$/.test(codeString)) {
    var a = {A:10,B:11,C:12,D:13,E:14,F:15,G:16,H:17,J:18,K:19,L:20,
             M:21,N:22,P:23,Q:24,R:25,S:26,T:27,U:28,V:29,X:30,Y:31,
             W:32,Z:33,I:34,O:35}[codeString.substr(0, 1)].toString();
    a = parseInt(a.substr(0, 1)) + parseInt(a.substr(1, 1) * 9);
    for (var i = 1; i < codeString.length; i++) {
      var d = 9 - i;
      d = 0 == d ? 1 : d;
      a += parseInt(codeString.substr(i, 1)) * d;
    }
    return 0 == a % 10 ? "正确" : "检查码不正确";
  }
  return "格式不正确";
};

身分证县市代码表