正则表达式【JavaScript】

JavaScript的正则表达式(Regular Expressions,简称Regex或RegExp)是一种强大的工具,用于匹配字符串中的模式。正则表达式包含许多元字符(Metacharacters),这些元字符用于定义模式的结构。

一、元字符

以下是一些常用的JavaScript正则表达式元字符及其含义:

1. 基本元字符

  • .:匹配除换行符之外的任何单个字符。
  • ^:匹配输入字符串的开始位置。
  • $:匹配输入字符串的结束位置。
  • \b:匹配单词边界(单词的开头或结尾)。
  • \B:匹配非单词边界。

2. 字符类

  • [...]:匹配字符集中的任何一个字符。例如,[abc] 匹配 abc
  • [^...]:匹配不在字符集中的任何一个字符。例如,[^abc] 匹配除了 abc 之外的任何一个字符。
  • \d:匹配任何一个数字字符(等价于 [0-9])。
  • \D:匹配任何一个非数字字符(等价于 [^0-9])。
  • \w:匹配任何一个字母、数字或下划线字符(等价于 [A-Za-z0-9_])。
  • \W:匹配任何一个非字母、数字或下划线字符(等价于 [^A-Za-z0-9_])。
  • \s:匹配任何一个空白字符(包括空格、制表符、换页符等)。
  • \S:匹配任何一个非空白字符。

3. 量词

  • *:匹配前面的元素零次或多次。
  • +:匹配前面的元素一次或多次。
  • ?:匹配前面的元素零次或一次。
  • {n}:匹配前面的元素正好 n 次。
  • {n,}:匹配前面的元素至少 n 次。
  • {n,m}:匹配前面的元素至少 n 次,但不超过 m 次。

4. 分组和捕获

  • (...):分组并捕获匹配的子表达式。
  • (?:...):分组但不捕获匹配的子表达式。
  • (?=...):正向前瞻,匹配但不在结果中包含。
  • (?!...):负向前瞻,匹配但不在结果中包含。
  • (?<=...):正向后顾,匹配但不在结果中包含。
  • (?<!...):负向后顾,匹配但不在结果中包含。

5. 常用转义字符

  • \\:匹配反斜杠字符。
  • \n:匹配换行符。
  • \t:匹配制表符。
  • \r:匹配回车符。
  • \f:匹配换页符。

6. 其他元字符

  • |:或操作符,匹配两者之一。例如,a|b 匹配 ab

7. 示例:

为了更好地理解这些正则表达式元字符和方法,我们可以通过具体的JavaScript实例来说明。

实例1: 使用 ., ^, 和 $

javascript 复制代码
let str = "hello";

// 使用 . 匹配任意字符
console.log(/./.test(str)); // true,因为 . 可以匹配任意字符

// 使用 ^ 匹配字符串开始的位置
console.log(/^h/.test(str)); // true,因为字符串以 'h' 开头

// 使用 $ 匹配字符串结束的位置
console.log(/o$/.test(str)); // true,因为字符串以 'o' 结尾

实例2: 使用 \w, \W, \d, \D, \s, \S

javascript 复制代码
let str = "Hello_123!";

// 使用 \w 匹配数字、字母和下划线
console.log(/\w/.test(str)); // true,因为 'H' 是字母

// 使用 \W 匹配非数字和字母
console.log(/\W/.test(str)); // true,因为 '!' 是非数字和字母

// 使用 \d 匹配数字
console.log(/\d/.test(str)); // true,因为 '1' 是数字

// 使用 \D 匹配非数字
console.log(/\D/.test(str)); // true,因为 'H' 是非数字

// 使用 \s 匹配空白字符
console.log(/\s/.test(str)); // false,因为没有空白字符

// 使用 \S 匹配非空白字符
console.log(/\S/.test(str)); // true,因为 'H' 是非空白字符

实例3: 使用 [], [^a-z], +, *, ?

javascript 复制代码
let str = "Hello123!";

// 使用 [] 匹配里面的任意字符
console.log(/[a-z]/.test(str)); // true,因为 'e' 是小写字母

// 使用 [^a-z] 匹配除a到z之外的所有字符
console.log(/[^a-z]/.test(str)); // true,因为 'H' 不是小写字母

// 使用 + 匹配重复一次或者多次
console.log(/l+/.test(str)); // true,因为 'll' 是重复的 'l'

// 使用 * 匹配重复0次或者多次
console.log(/x*/.test(str)); // true,因为 'x' 可以重复0次

// 使用 ? 匹配重复1次或者是0次
console.log(/H?/.test(str)); // true,因为 'H' 出现1次

实例4: 使用 (), |, ?:, ?=, ?!, ?<=, ?<!, {4,8}

javascript 复制代码
let str = "Hello123!";

// 使用 () 分组匹配
console.log(/(l)/.test(str)); // true,因为 'l' 被分组匹配

// 使用 | 或者
console.log(/H|e/.test(str)); // true,因为 'H' 或 'e' 存在

// 使用 ?: 分组匹配不捕获
console.log(/(?:l)/.test(str)); // true,但不会捕获 'l'

// 使用 ?= 正向肯定预查
console.log(/H(?=e)/.test(str)); // true,因为 'H' 后面是 'e',但不匹配 'e'

// 使用 ?! 正向否定预查
console.log(/H(?!x)/.test(str)); // true,因为 'H' 后面不是 'x'

// 使用 ?<= 反向肯定预查
console.log(/(?<=H)e/.test(str)); // true,因为 'e' 前面是 'H',但不匹配 'H'

// 使用 ?<! 反向否定预查
console.log(/(?<!x)e/.test(str)); // true,因为 'e' 前面不是 'x'

// 使用 {4,8} 最少4位 最多8位匹配
console.log(/[a-z]{4,8}/.test(str)); // true,因为 'Hello' 符合4到8位的条件

实例5: 使用 test(), exec(), match(), search(), replace()

javascript 复制代码
let str = "Hello, World!";

// 使用 test()
console.log(/Hello/.test(str)); // true,因为 'Hello' 存在于字符串中

// 使用 exec()
let result = /Hello/.exec(str);
console.log(result); // ["Hello"],返回匹配的数组

// 使用 match()
console.log(str.match(/Hello/)); // ["Hello"],返回匹配的数组

// 使用 search()
console.log(str.search(/Hello/)); // 0,返回第一个匹配的位置

// 使用 replace()
console.log(str.replace(/Hello/, "Hi")); // "Hi, World!",替换了 'Hello' 为 'Hi'

这些实例展示了如何使用JavaScript中的正则表达式来匹配和操作字符串。理解这些元字符和方法可以帮助你更有效地处理字符串操作。

二、正则表达式案例

1. 检查用户名格式

javascript 复制代码
<script>
function checkUser(str) {
    // 模式
    var re = /^[a-zA-Z][a-zA-Z0-9_]{3,15}$/g;
    if (re.test(str)) {
        return '正确';
    } else {
        return '错误';
    }
}
console.log(checkUser('h111')); // 正确
console.log(checkUser('1h111')); // 错误
</script>

2. 检查邮箱格式

javascript 复制代码
<script>
function checkEmail(str) {
    // 模式
    var re = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/g;
    if (re.test(str)) {
        return '正确';
    } else {
        return '错误';
    }
}
console.log(checkEmail('[email protected]')); // 正确
console.log(checkEmail('example@example')); // 错误
</script>

3. 检查电话号码格式(仅限数字)

javascript 复制代码
<script>
function checkPhone(str) {
    // 模式
    var re = /^\d{10}$/g;
    if (re.test(str)) {
        return '正确';
    } else {
        return '错误';
    }
}
console.log(checkPhone('1234567890')); // 正确
console.log(checkPhone('123456789')); // 错误
</script>

4. 检查密码格式(至少一个大写字母、一个小写字母、一个数字、一个特殊字符,长度为8到20)

javascript 复制代码
<script>
function checkPassword(str) {
    // 模式
    var re = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,20}$/g;
    if (re.test(str)) {
        return '正确';
    } else {
        return '错误';
    }
}
console.log(checkPassword('Password1!')); // 正确
console.log(checkPassword('password')); // 错误
</script>

5. 检查URL格式

javascript 复制代码
<script>
function checkURL(str) {
    // 模式
    var re = /^(http|https):\/\/[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/g;
    if (re.test(str)) {
        return '正确';
    } else {
        return '错误';
    }
}
console.log(checkURL('http://example.com')); // 正确
console.log(checkURL('example.com')); // 错误
</script>

6. 检查日期格式(YYYY-MM-DD)

javascript 复制代码
<script>
function checkDate(str) {
    // 模式
    var re = /^\d{4}-\d{2}-\d{2}$/g;
    if (re.test(str)) {
        return '正确';
    } else {
        return '错误';
    }
}
console.log(checkDate('2024-10-07')); // 正确
console.log(checkDate('2024-10-7')); // 错误
</script>

7. 检查IP地址格式

javascript 复制代码
<script>
function checkIP(str) {
    // 模式
    var re = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/g;
    if (re.test(str)) {
        // 进一步检查每个部分是否在0到255之间
        var parts = str.split('.');
        if (parts.every(part => part >= 0 && part <= 255)) {
            return '正确';
        } else {
            return '错误';
        }
    } else {
        return '错误';
    }
}
console.log(checkIP('192.168.1.1')); // 正确
console.log(checkIP('192.168.1')); // 错误
console.log(checkIP('256.168.1.1')); // 错误
</script>
相关推荐
struggle202541 分钟前
continue通过我们的开源 IDE 扩展和模型、规则、提示、文档和其他构建块中心,创建、共享和使用自定义 AI 代码助手
javascript·ide·python·typescript·开源
x-cmd1 小时前
[250512] Node.js 24 发布:ClangCL 构建,升级 V8 引擎、集成 npm 11
前端·javascript·windows·npm·node.js
夏之小星星1 小时前
el-tree结合checkbox实现数据回显
前端·javascript·vue.js
为美好的生活献上中指3 小时前
java每日精进 5.11【WebSocket】
java·javascript·css·网络·sql·websocket·网络协议
拖孩4 小时前
【Nova UI】十五、打造组件库之滚动条组件(上):滚动条组件的起步与进阶
前端·javascript·css·vue.js·ui组件库
苹果电脑的鑫鑫5 小时前
element中表格文字剧中可以使用的属性
javascript·vue.js·elementui
一丝晨光5 小时前
数值溢出保护?数值溢出应该是多少?Swift如何让整数计算溢出不抛出异常?类型最大值和最小值?
java·javascript·c++·rust·go·c·swift
Wannaer6 小时前
从 Vue3 回望 Vue2:响应式的内核革命
前端·javascript·vue.js
懒羊羊我小弟6 小时前
手写符合Promise/A+规范的Promise类
前端·javascript
赵大仁6 小时前
React vs Vue:点击外部事件处理的对比与实现
javascript·vue.js·react.js