正则表达式

正则表达式(Regular Expression)是一种用于描述字符模式的规则,主流语言对其都有良好的支持。

文章目录

      • 一、元字符
      • 二、常见校验
        • 1、校验数字的表达式
        • 2、校验字符的表达式
        • 3、 特殊需求表达式
      • 三、JavaScript中使用正则表达式
      • 四、在java中使用正则表达式

一、元字符

正则表达式中有许多元字符,它们具有特殊的含义:

1、字符类相关

  1. 点号(.)
    • 匹配除换行符之外的任意单个字符。例如,在表达式a.b中,“.”可以匹配ab之间的任意一个字符,像aabacb等都匹配。
  2. 方括号([])
    • 用于定义字符类。例如[abc]表示匹配a或者b或者c。还可以使用范围表示法,如[a - z]匹配任意小写字母。
    • 还有否定字符类,如[^abc]表示匹配除了abc之外的任意字符。
  3. 预定义字符类
    • \d:匹配任意一个数字字符,等同于[0 - 9]
    • \D:匹配任意一个非数字字符,等同于[^0 - 9]
    • \w:匹配任意一个字母、数字或者下划线字符,等同于[a - zA - Z0 - 9_]
    • \W:匹配任意一个非字母、数字或者下划线字符,等同于[^a - zA - Z0 - 9_]

2、边界相关

  1. ^
    • 当在表达式开头时,表示匹配输入字符串的开始位置。例如^abc表示匹配以abc开头的字符串。
  2. $
    • 当在表达式结尾时,表示匹配输入字符串的结束位置。例如abc$表示匹配以abc结尾的字符串。

3、量词相关

  1. *(星号)
    • 表示前面的字符或者字符组可以出现零次或多次。例如a*可以匹配空字符串、aaa等。
  2. +(加号)
    • 表示前面的字符或者字符组至少出现一次。例如a+可以匹配aaa等,但不能匹配空字符串。
  3. ?(问号)
    • 表示前面的字符或者字符组最多出现一次。例如a?可以匹配空字符串或者a
  4. {n}(花括号中指定次数)
    • 表示前面的字符或者字符组恰好出现n次。例如a{3}只匹配aaa
  5. {n,}(至少n次)
    • 表示前面的字符或者字符组至少出现n次。例如a{3,}可以匹配aaaaaaa等。
  6. {n,m}(n到m次)
    • 表示前面的字符或者字符组出现nm次。例如a{2,4}可以匹配aaaaaaaaa

4、分组与引用相关

  1. ()(小括号)
    • 用于分组。例如(ab)+表示ab这个组合至少出现一次。
    • 还可以用于捕获组,在一些正则表达式引擎中可以引用捕获组匹配到的内容。
  2. \n(反斜杠加数字)
    • 在支持的情况下,用于引用之前捕获组的编号。例如在表达式(a)\1中,\1引用了第一个捕获组(即a),这个表达式匹配aa

5、其他特殊元字符

  1. |(竖线)
    • 表示或的关系。例如a|b表示匹配a或者b
  2. \(反斜杠)
    • 主要用于转义特殊字符,使其失去特殊含义而表示其本身。例如要匹配一个实际的点号,就需要写成\.
      6、贪婪模式和非贪婪模式
      正则表达式中的贪婪模式和非贪婪模式主要体现在量词的匹配行为上。

(1)、贪婪模式

  1. 概念
    • 贪婪模式下,量词会尽可能多地匹配字符。例如,对于表达式a.*b,如果用于匹配字符串aabab,它会尽可能多地匹配前面的a和后面的b之间的内容,结果会是整个字符串aabab被匹配到。
  2. 常见量词的贪婪表现
    • *(零次或多次)、+(一次或多次)、?(零次或一次)这几个量词在默认情况下都是贪婪的。例如,对于字符串
      content
      more content
      ,表达式
      .*
      会匹配从第一个
      开始一直到最后一个
      之间的所有内容,因为它会贪婪地匹配尽可能多的字符。

(2)、非贪婪模式

  1. 概念
    • 非贪婪模式下,量词会尽可能少地匹配字符。要实现非贪婪模式,通常在量词后面加上?。例如,对于表达式a.*?b,用于匹配字符串aabab时,它会先匹配到aab就停止了,因为这样就满足了最少匹配的要求。
  2. 常见量词的非贪婪表现
    • *+?变为非贪婪模式后,在处理上述包含多个相同标签的HTML字符串时就会有不同的结果。如对于
      content
      more content
      ,表达式
      .*?
      会分别匹配到两个
      标签内的内容,因为它每次都只匹配到满足条件的最少字符数。

二、常见校验

1、校验数字的表达式
  • 数字^[0-9]*$
  • n位的数字^\d{n}$
  • 至少n位的数字^\d{n,}$
  • m-n位的数字^\d{m,n}$
  • 零和非零开头的数字^(0|[1-9][0-9]*)$
  • 非零开头的最多带两位小数的数字^([1-9][0-9]*)+(\.[0-9]{1,2})?$
  • 带1-2位小数的正数或负数^(\-)?\d+(\.\d{1,2})?$
  • 正数、负数、和小数^(\-|\+)?\d+(\.\d+)?$
  • 有两位小数的正实数^[0-9]+(\.[0-9]{2})?$
  • 有1~3位小数的正实数^[0-9]+(\.[0-9]{1,3})?$
2、校验字符的表达式
  • 汉字^[\u4e00-\u9fa5]{0,}$
  • 英文和数字^[a-zA-Z0-9]+$
  • 长度为3-20的所有字符^.{3,20}$
  • 由26个英文字母组成的字符串^[A-Za-z]+$
  • 由26个大写英文字母组成的字符串^[A-Z]+$
  • 由26个小写英文字母组成的字符串^[a-z]+$
  • 由数字和26个英文字母组成的字符串^[A-Za-z0-9]+$
  • 由数字、26个英文字母或者下划线组成的字符串^\w+$
3、 特殊需求表达式
  • Email地址^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
  • 域名[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
  • Internet URL[a-zA-z]+://[^\s]*^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
  • 手机号码^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9])\d{8}$
  • 电话号码^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
  • 身份证号(15位、18位数字)^\d{15}|\d{18}$
  • 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线)^[a-zA-Z][a-zA-Z0-9_]{4,15}$
  • 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线)^[a-zA-Z]\w{5,17}$
  • 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间)^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
  • 日期格式^\d{4}-\d{1,2}-\d{1,2}$
  • 一个月的31天^((0?[1-9])|((1|2)[0-9])|30|31)$

三、JavaScript中使用正则表达式

在JavaScript中,正则表达式(RegExp)是一种用于匹配字符串中字符组合的模式。要使用正则表达式,首先需要创建一个RegExp对象,并使用它的方法来匹配字符串中的模式。

以下是一个简单的示例,说明如何在JavaScript中使用正则表达式:

  1. 创建RegExp对象:
// 使用字面量语法创建正则表达式
const regex1 = /pattern/flags;

// 使用RegExp构造函数创建正则表达式
const regex2 = new RegExp('pattern', 'flags');

其中,pattern是你要匹配的正则表达式模式,flags是可选的修饰符,例如g表示全局匹配,i表示不区分大小写,m表示多行匹配等。

例如:

const regex = /hello/gi; // 匹配字符串中的"hello",忽略大小写,并进行全局匹配
  1. 使用RegExp对象的方法:

RegExp对象有两个主要方法:test()exec()

  • test():测试字符串是否匹配正则表达式,返回布尔值。
const regex = /hello/gi;
const str = 'Hello, world! Hello, everyone!';
console.log(regex.test(str)); // 输出:true
  • exec():在字符串中查找匹配正则表达式的子串,并返回一个包含匹配结果的数组。如果没有匹配项,则返回null
const regex = /hello/gi;
const str = 'Hello, world! Hello, everyone!';
const result = regex.exec(str);

console.log(result); // 输出:["Hello", index: 0, input: "Hello, world! Hello, everyone!", groups: undefined]
  1. 使用字符串的match()replace()search()split()方法:

JavaScript中的字符串对象也提供了一些与正则表达式相关的方法。

  • match():在字符串中查找匹配正则表达式的子串,并返回一个包含匹配结果的数组。
const str = 'Hello, world! Hello, everyone!';
const regex = /hello/gi;
const result = str.match(regex);

console.log(result); // 输出:["Hello", "Hello"]
  • replace():使用正则表达式替换字符串中的匹配项。
const str = 'Hello, world! Hello, everyone!';
const regex = /hello/gi;
const newStr = str.replace(regex, 'Hi');

console.log(newStr); // 输出:"Hi, world! Hi, everyone!"
  • search():在字符串中查找匹配正则表达式的子串,并返回第一个匹配项的索引。
const str = 'Hello, world! Hello, everyone!';
const regex = /hello/gi;
const index = str.search(regex);

console.log(index); // 输出:0
  • split():使用正则表达式分割字符串,并返回一个包含子串的数组。
const str = 'apple,banana,orange';
const regex = /,/;
const arr = str.split(regex);

console.log(arr); // 输出:["apple", "banana", "orange"]

四、在java中使用正则表达式

在Java中使用正则表达式主要通过java.util.regex包中的PatternMatcher类。

一、创建Pattern对象

  1. 直接定义正则表达式字符串创建
    • 例如要创建一个匹配数字的正则表达式模式:
    import java.util.regex.Pattern;
    
    public class RegexExample {
        public static void main(String[] args) {
            String regex = "\\d+";
            Pattern pattern = Pattern.compile(regex);
        }
    }
    
    • 这里的\\d+是正则表达式,因为在Java字符串中,反斜杠需要转义,所以数字的正则表达式\d+要写成\\d+
  2. 使用预定义字符类创建
    • 如创建匹配字母或数字的模式:
    Pattern pattern = Pattern.compile("[a - zA - Z0 - 9]+");
    

二、创建Matcher对象并进行匹配操作

  1. 创建Matcher对象
    • 需要使用Pattern对象的matcher方法,并传入要匹配的字符串。
    • 假设已经有Pattern pattern = Pattern.compile("\\d+");和一个字符串String str = "abc123def";,则Matcher matcher = pattern.matcher(str);
  2. 匹配操作
    • 检查是否匹配
      • 使用matches方法检查整个字符串是否匹配,如boolean isMatch = matcher.matches();对于上述strpatternisMatchfalse,因为整个字符串不是单纯的数字。
    • 查找匹配部分
      • 使用find方法查找字符串中的匹配部分。例如:
      while (matcher.find()) {
          System.out.println(matcher.group());
      }
      
      • 在这个例子中,它会输出123,因为这是在str中的数字部分。
    • 替换匹配部分
      • 可以使用replaceAll方法替换匹配的部分。如将字符串中的数字替换为#
      String newStr = matcher.replaceAll("#");
      System.out.println(newStr);
      
      • 这会输出abc#def

三、捕获组相关操作

  1. 定义捕获组
    • 在正则表达式中使用括号来定义捕获组。例如(\\d+)-([a - z]+)这个正则表达式有两个捕获组,一个是数字部分,一个是字母部分。
  2. 获取捕获组内容
    • Matcher对象中,可以使用group(int group)方法获取特定捕获组的内容。例如matcher.group(1)获取第一个捕获组(数字部分)的内容。

你可能感兴趣的:(前端技术,后端技术,正则表达式,java,javascript)