Code前端首页关于Code前端联系我们

正则表达式基础入门学习教程

terry 2年前 (2023-09-25) 阅读数 50 #后端开发

概述

正则表达式是一种用于匹配字符串的字符比较模式。主要用于表单验证。正则表达式:正则表达式,简称RegExp。

创建正则表达式最简单的方法是使用正则表达式。

文学:使用两个 / 作为分隔符。通常,将文字分配给变量。

var 模式 = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za- z]{2,4})$/;

正则表达式可以使用一些字符串方法或正则方法来处理:

字符串方法:

  • split()根据相应的字符串分割父字符,返回子字符串数组。
  • match() 使用正则表达式来匹配字符串并返回包含匹配结果的数组。
  • search() 搜索正则表达式或指定字符串并返回第一个匹配项的下标。
  • replace() 使用正则表达式直接比较字符串,然后用新的子字符串替换匹配的子字符串并返回新的匹配字符串。

正则表达式方法:

  • exec()对目标字符串进行正则匹配操作,返回第一个匹配子字符串的数组。
  • test() 测试当前正则表达式是否能够匹配目标字符串,返回 true 或 false。

不同的数据类型有自己的方法和属性,使用时必须正确调用。下面分别介绍几种方法的使用。

字符串方法

  • plit()根据匹配字符串切割原始字符串。 split方法传递的参数是分隔符,可以是str或reg。当找到分隔符时,会将其从 str 中清除,并返回一个子字符串数组。

如果没有找到分隔符,则返回的数组包含由整个p组成的元素数组。如果分隔符为空字符串“”,则返回由该字符串的每个字符组成的元素数组。返回值:由提取的子字符串组成的数组。它可用于将非标准用户输入字符串转换为正确的字段。 ? each() 搜索正则表达式或指定字符串。传递的参数是一个字符串或reg,返回第一次匹配的索引(类似于indexOf)。

返回值:子字符串第一次出现的下标或父字符串中普通匹配的结果。搜索只会找到第一次搜索到的位置索引,因此全局标志不起作用。如果匹配的子字符串在父字符串中没有匹配字符,则结果将为-1。 (可以使用搜索字符串在表中搜索关键字,条件判断是看是否等于-1)

function withSearch(str){
            var newStr = "";
            for(var i =0; i<str.length; i++){
                if(newStr.search(str[i]) == -1){
                    newStr += str[i];
                }
            }
            return newStr;
        }
        console.log(withSearch('abcdde'));     //abcde
  • match() 使用正则表达式来匹配字符串,它只接受一个参数,它可以是正则表达式或 reg 对象,并返回包含匹配结果的数组。与调用常规exec方法基本相同。

返回值:匹配结果组成的数组。与 split 类似,它返回一个数组,但 match 返回第一个匹配的子字符串,但您可以使用 g 全局标志来搜索所有子字符串。

查询'abbcccbbbbbbddbbbdabbb'中重复的字符串'b'

'abbcccbbbbbddbbbdabbb'.match(/b+/);     //['bb']
  • replace() 使用正则表达式直接比较字符串,然后用新的子字符串替换匹配的子字符串。参数:传递两个参数,第一个是常规或匹配的字符串,第二个是要替换的新内容或函数。

返回值:是一个新字符串,原字符串不改变。如果第一个参数是字符串,则只替换第一个子字符串;如果你想替换所有子字符串,唯一的方法是输入 reg 并给出 g 标志。

示例:过滤字符串中的空格: 'aa b c d e f ' => "aabcdef" 使用全局分隔符 g 进行全局比较和替换。

str.replace(/\s+/g, ‘’);      //用空字符串替换匹配的空白

常规方法

  • exec() 在字符串中搜索匹配的字符串,并返回包含匹配结果的数组。返回的数组有两个特殊属性。可以通过调用index属性和input属性来检查对应子字符串在字符串中的位置,input代表reg引用的字符串。

参数:要查找的字符串。

exec 方法将始终只返回一个匹配项,即使在模式中设置了全局标志 g。当 g 未设置时,对同一 str 多次调用 exec() 始终返回第一个匹配项;设置 g 后,每次调用 exec() 将继续在字符串中搜索新的匹配项,直到到达字符串末尾。 lastIndex会随着全局模式++的调用而改变。 《高级程序设计》

  • test() 测试字符串是否与正则表达式匹配。传递的参数是一个字符串。如果字符串中存在正则表达式匹配,则返回 true。如果正则表达式的开头或结尾没有限制,只要字符串包含正则匹配,就返回 true,否则返回 false。

测试方法通常用作 if 语句中的条件。

判断 'aaddccddabcddeeddfff' 是否包含字符串 'abc'

/abc/.test('aaddccddabcddeeddfff');  //true

正则表达式术语和运算符

正则表达式由一些正则字符和一些特殊字符(也称为元字符)元字符组成。常见字符包括大小写字母和数字,而元字符则具有特殊含义。特殊字符:JavaScript中常用的常见特殊字符包括

( ) [ ] { } \ ^ $ | ? * + .要匹配此类字符,必须使用转换符号 \,如:\(,\^,\\

  • 精确匹配

正则表达式由多个正则字符组成。在匹配字符串时,需要精确匹配,例如/good/。匹配时,字符串必须包含字符g、o、o、d。且顺序不能改变,中间不允许有其他字符,表示该字符串是“good”

  • 预定义特殊字符

预定义特殊字符: ,例如:console .log(/\n/.test(aaabbb)); 问题:"" 无法换行包含回车换行的字符串.

解决方法:将数字1前的``引号替换为``引号,可以包含回车符。\f /\f/ 构成源字符\b /\b/space 表示匹配的是空格,\ b 可以与像这样的字符配对。边界搜索标识符将在 border 处详细讨论。

  • 字符集
    字符集:表示可以匹配该类中的任何字符。要点是 [] 类对应于一个字符。打字字符集:【字符类】

简单类:多个常用字符对应一个字符。我们可以用 [] 将它们括起来,这样整个 [] 就匹配单个字符 o[abc]z →oaz, obz, ocz

Range 类:有时候要匹配的东西太多,类型又相同。全部输入太难了。我们可以在中间添加一条水平线。[a-z]、[0-9]、[A-Z]

组合类:允许使用括号比较不同类型的单个字符 [a-zA-Z0-9] [a-zA-Z_$][a-zA - Z0 -9_$]变量名命名规则[0-9a-z]:表示可以匹配小写字母或数字。

否定类:在[]开头添加元字符^对其进行否定,即括号内的字符不能匹配。 [^a]:表示如果没有a,则可以匹配成功。

  • 修饰符

g 全局修饰符,搜索不是在找到第一个结果后结束,而是在找到全局范围内的所有结果后结束。全球:全球,全球。书写位置:在正则符号//g.

i后面使用修饰符,进行不区分大小写的匹配。不区分大小写的输入位置:在常用符号 //i

m 之后表示多行模式,忽略换行符。请注意,

  • 边界

^ 的开头不能跟在左方括号后面。写入位置:写入在常规//符号的开头,这意味着后面的字符必须成功匹配并且是字符串的开头。

$写入结束位置:写在常规//符号内的结束位置,这意味着$之前的字符必须匹配成功并且是字符串的结尾。

使用^和$组合来定义字符串的开头和结尾,意味着中间的字符必须成功匹配,并且所有字符必须放在开头和结尾。换句话说,中间部分就是整个链条。

\b单词边界用于查找单词开头或结尾的匹配项。间隔小于 ^$ 并且仅适用于单词。 \b 匹配其他字符,并且其他字符必须先匹配。如果是\ba,它必须首先匹配字符a,并且必须位于单词的开头。如果 c\b 则意味着它必须匹配 c 并且还要求 c 位于单词的末尾。

如果\b前后都是,说明内部匹配的结果一定是一个完整的单词。

\B非单词边界,用于查找不在单词开头或结尾的匹配项。 \B 还必须匹配其他符号,这意味着除非匹配成功,否则前后匹配的字符不能位于单词的开头或结尾。

  • 预定义类

本质是简化一些最常用的特殊类的字符集的写法。

[^\n\r] 除换行和回车之外的任何字符。匹配:除回车换行之外的所有其他字符,如数字、字母、汉字、特殊符号、空格、缩进等。

\d[0-9] 匹配数字字符(digital):匹配任何数字字符。

\D[^0-9] 匹配非数字字符:非数字字符,只要不是数字,都可以成功匹配

\s[ \t\n\x0B\f\r ] 匹配空字符(空格):可以匹配所有空格,包括缩进、回车、换行、空格、换页。

\S[^\t\n\x0B\f\r]非空匹配:表示可以找到除空格之外的所有非空字符。

\w[a-zA-Z_0-9] 单词字符(所有字母/数字/下划线) 匹配:所有字母(大小写)、数字和下划线。

\W[^a-zA-Z_0-9]非单词字符匹配:除了数字、字母和下划线外,其他都可以匹配。

  • 量词

有时,当遇到一个常用符号需要连续匹配多次时,可以使用量词来描述重复次数。使用 {} 将数字括起来,表示前一个字符可以出现的次数。

{n}硬量词对应零次或n次。这意味着:n是多少次,前一个符号必须连续出现相应的次数。

{n,m}软量词出现至少n次但不超过m次(中间没有空格)意思是:前面的字符必须至少出现n次,最多m次。

{n,}软量词出现至少n次(更新版本+)意思是:前一个字符可能出现n次或更多。

?{0,1} 软量词出现零次或一次

*{0,} 软量词出现零次或多次(任意次数)

+{1,} 软量词出现 1 个或多个times(至少一次)

量词只能修改前一个字符,但不能直接修改前一个字符。要控制多个字符,必须将要使用的字符串括在括号中。

运算符可以使用竖线字符 (|) 来表达或关系。 OR 运算符将整个正则表达式分成两部分,没有任何限制。如果匹配成功,则返回真相。

如果我们要比较a和c中的d或b,我们必须将d和b之间的OR关系放在括号中,以缩小OR运算符的范围。

虽然量词的出现可以帮助我们处理一系列密切相关的同类型字符。但这还不够,我们使用方括号表示范围选择,使用大括号表示迭代次数。如果我们想要获得多个重复字符,我们必须使用括号将它们分组。用括号分组后,可以对内部字符进行整体控制。

  • 分组反向链接

反向链接标识符是对正则表达式“\number(表达式中)”、“$number(表达式中)(公式外)”中匹配组捕获的子字符串进行编号,以供参考。从1开始数。

如果正则表达式中有一组括号,则在字符串中找到匹配的子串。子字符串的结果可以在正则表达式中二次使用,也可以在正则表达式之外调用两次。如果正则表达式中有多个括号,则从左到右编号为1,2,3...。这个方法可以用来代替 exec test str

正常规则中:使用\1,将子串1的结果倒过来使用。

超出正则表达式:使用$1,并反向使用子串1的结果。

反向链接到字符串替换方法。第一个参数:正则表达式。如果它们在括号内,则可以对它们进行编号。括号中依次匹配第一组、第二组... 第二个参数:可以使用组匹配结果来创建反向链接。

更常见的方法是将第二个替换参数设置为替换函数。 ?结果是替换字符串的内容。

应用:查找字符串中最长的重复子串

 function demo(str) {
        var arr = str.split(''); //把字符串转换为数组
        str = arr.sort().join(''); 

        var value = ‘’;     //用来存放出现最多的substr的中间变量
        var index = 0;     //用来存放最大长度
            
       var re = /(\w)\1+/g; //
           
        str.replace(re, function ($0, $1) {
            //alert($0); 代表每次匹配成功的结果 : aa dd jj kk l sssssssssssssssss
            //alert($1); 代表每次匹配成功的第一个子项,也就是\w: a d j k l s 

        if (index < $0.length) { //如果index保存的值小于$0的长度就进行下面的操作
            index = $0.length; // 这样index一直保存的就在最大的长度
            value = $0; //value保存的是出现最多的这个字符
        }
    });
        alert('最多的字符:' + value + ',重复的次数:' + index); 
    }
  • 汉字

中文匹配:[\u4e00-\u9fa5]网络常用表达

  • 用户名:4-16个字符、字母、数字、下划线、减号。同时包含的内容可以通过将其放置在+类别中多次选择。
 var pattern = /^[a-zA-Z0-9_-]{4,16}$/;
  • 密码强度:至少6个字符,包括1个大写字母、1个小写字母、1个数字、1个特殊符号
var pattern = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/;

(?(?

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门