正则表达式

介绍 正则表达式(regular expression),常简写为regex,用简单字符串来描述、匹配文中全部匹配指定格式的字符串。人话讲就是根据一些规则制定一个字符串,然后你可以用这个字符串来筛选满足规则的字符串。许多程序设计语言都支持用正则表达式操作字符串,这里主要介绍正则表达式在Java中的运用。 不同编程语言的正则表达式引擎有所不同,这里提供一个链接,里面详细介绍了不同语言对各种特性的支持程度。 快速使用 先说明一下\的使用。 在Java普通字符串中,反斜杠\本身就是转义字符,比如\n被转义为"换行符",又比如\\被转义为\。而正则表达式也有自己的语法,它也使用反斜杠作为转义字符,比如\d表示“匹配一个数字”。 那么二者结合起来呢🧐。以"\\d"为例。编译器看到字符串"\\d"会根据字符串规则将其转换为两个字符,一个\,一个d。接下来正则表达式引擎会对其进行解析,最终生效的正则模式就是\d。可以这样理解:正则表达式需要 \d 来匹配数字。但在Java字符串里,一个 \ 需要写成 \\。所以,要把正则的 \d 放到Java字符串里,就变成了 \\d。 到底需不需要两个\\,idea会给你答案。 java.util.regex包是Java标准库中用于支持正则表达式操作的包,主要涉及到Pattern和Matcher这两个类的操作。这里有个简单的例子: String pattern = "java\\d"; String text1 = "java1"; String text2 = "javaBad"; Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(text1); System.out.println(m.matches());//true m = p.matcher(text2); System.out.println(m.matches());//false 先调用Pattern类的静态方法compile(参数为正则表达式)生成一个实例对象,通过调用该对象的matcher方法(参数为待匹配文本)生成一个Matcher实例。接下来就有很多方法供你选择,这里我调用的是matches方法来输出布尔值,在例子中体现为字符串Java后面能否匹配上数字。Matcher类里还有个find方法也很常见,下文会提到。 匹配规则详解 简单匹配 为方便演示,接下来的示例代码使用String类的matches方法,该方法底层原理仍然是Pattern和Matcher这两个类的使用,后面有详细说明。下面示例参考廖雪峰和菜鸟教程。 匹配任意字符:.可以匹配除\r\n之外的任何单个字符。如a.c可以匹配abc但不能匹配abbc和ac 匹配数字:\d匹配 0~9 的数字,同样只匹配一个字符。匹配非数字:\D匹配非数字。 匹配常用字符:\w可以匹配一个字母、数字或下划线 匹配空格字符:\s可以匹配任何空白字符,包括空格、制表符、换页符等。与[\f\n\r\t\v]等效。\W和\S和\D同样是反着来的。 重复匹配: *可以匹配任意个字符,包括0个字符。 +可以匹配至少一个字符。比如A\d+可以匹配A11111和A0。但不能匹配A,因为至少一个字符。 ?可以匹配0个或一个字符。 如果想精确指定n个字符,使用{n},比如A\d{3}可以匹配到A123。指定匹配n~m个字符,用{n,m}, 例如A\d{3,5}可以精确匹配A123 A1234 A12345。{n,}表示可以匹配至少n个字符。m和n为非负整数,其中n <= m。再举一个例子:o{2}和Bob中的一个o不匹配,而匹配food中的两个o。不同表达式可能是等效的,比如o{0,1}和o? 来个综合点的例子:假如电话号码规则如下:34位数字表示区位,78位数字表示电话,中间用-连接。答案:\\d{3,4}-\\d{7,8}。对于连字符-,一般情况下只是一个普通字符,不需要进行转义,当然写上两个反斜杠也是对的,idea会给出提示移除多余的反斜杠。 String pattern = "\\d{3,4}-\\d{7,8}";//不知道需不需要写\?idea会给你的答案 String text1 = "0123-123456"; String text2 = "010-1234567"; System.out.println(text1.matches(pattern));//false System.out.println(text2.matches(pattern));//true 复杂匹配: 匹配开头和结尾:^匹配输入字符串开始的位置,$匹配输入字符串结束的位置。他们俩的作用是将匹配过程限制在整个字符串上,避免了在子串中成功匹配的情况。其实matches()方法的行为已经隐含了^...$锚点的效果,而find()方法则没有。matches方法尝试将整个输入序列与模式匹配,而find方法会在输入序列中查找下一个与模式匹配的子序列。仔细品味这两个方法的名字,你也许会理解。 ...

September 22, 2025 · 2 分钟 · 229 字 · Me