专栏首页java一日一条(转)java正则表达式(二)

(转)java正则表达式(二)

首先说一下java正则表达式的重点概念: 第一、相关类:Pattern、Matcher 第二、典型的调用顺序是 Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches(); 在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。 语句 boolean b = Pattern.matches("a*b", "aaaaab");等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。 此类的实例是不可变的,可供多个并发线程安全使用。Matcher 类的实例用于此目的则不安全。 第三、正则表达式的构造摘要 字符类 [abc] a、b 或 c(简单类) [^abc] 任何字符,除了 a、b 或 c(否定) [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围) [a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集) [a-z&&[def]] d、e 或 f(交集) [a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去) [a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去) 说明: []表示范围--某一个字符的范围 ^表示非 &&表示 预定义字符类 . 任何字符(与行结束符可能匹配也可能不匹配) \d 数字:[0-9] \D 非数字: [^0-9] \s 空白字符:[ \t\n\x0B\f\r] \S 非空白字符:[^\s] \w 单词字符:[a-zA-Z_0-9] \W 非单词字符:[^\w] 说明:预定义字符类和字符类部分可以互换。如:[0-9] == \d 数量词 X? :X出现一次或一次也没有 X* :X出现零次或多次 X+ :X出现一次或多次 X{n} :X出现恰好 n 次 X{n,} :X出现至少 n 次 X{n,m} :X出现至少 n 次,但是不超过 m 次 例子:a?bc 表示在一个字符串中a出现0次或1次,abc或bc都可以匹配,aabc不可匹配 捕获组和非捕获组 组的表示方法: 捕获组 捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组: 1 ((A)(B(C))) 2 \A 3 (B(C)) 4 (C) 组零始终代表整个表达式 之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器检索。 Back 引用 是说在后面的表达式中我们可以使用组的编号来引用前面的表达式所捕获到的文本序列(是文本不是正则)。 例如 ([" ']).* \1 其中使用了分组,\1就是对引号这个分组的引用,它匹配包含在两个引号或者两个单引号中的所有字符串,如,"abc" 或 " ' " 或 ' " ' ,但是请注意,它并不会对" a'或者 'a"匹配。原因上面已经说明,Back引用只是引用文本而不是表达式。 非捕获组 以 (?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。就是说,如果小括号中以?号开头,那么这个分组就不会捕获文本,当然也不会有组的编号,因此也不存在Back 引用。 在Java中,支持的非捕获组,有如下几种: (?=X) X,通过零宽度的正 lookahead 即左侧匹配 (?!X) X,通过零宽度的负 lookahead 即左侧匹配 (?<=X) X,通过零宽度的正 lookbehind 即右侧匹配 (?<!X) X,通过零宽度的负 lookbehind 即右侧匹配 这四个非捕获组用于匹配表达式X,但是不包含表达式的文本。 (?=X ) 零宽度正先行断言。仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。 (?!X) 零宽度负先行断言。仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,例如,\w+(?!\d) 与后不跟数字的单词匹配,而不与该数字匹配。 (?<=X) 零宽度正后发断言。仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。 (?<!X) 零宽度负后发断言。仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配 说明: 非捕获组中四个表达式的区别: (?=X ) 和(?!X)用于右侧匹配 (?<=X)和(?<!X)用于左侧匹配

本文分享自微信公众号 - java一日一条(mjx_java),作者:小马哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-04-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 你应该学习正则表达式

    Regular Expressions (Regex):正则表达式,软件工程中最为强大,且广泛适用,令人信服的技术之一。从验证电子邮件地址到执行复杂的代码重构器...

    哲洛不闹
  • JAVA&amp;大数据架构方向 同与异?

    架构不是一个职业而是一种能力,每一种架构师只不过是在不同的领域里面使用不同的技术,没有什么可对比,就好比如你问一个篮球明星和一个足球明星有什么区别一样!

    哲洛不闹
  • 年薪百万,原来Java大数据才是真正的高富帅!

    大数据时代,中国IT环境也将面临重新洗牌,不仅仅是企业,更是程序员们转型可遇而不可求的机遇。

    哲洛不闹
  • 正则表达式思维导图,不再难懂

    01 一张思维导图 ? 02 导图内容解析 工具 RegexBuddy 语法结构 字符 [ab5@] 匹配"a"或"b"或"5"或"@" [^abc] 匹配a、...

    java思维导图
  • 正则表达式基本语法

    \将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,“n”匹配字符“n”。“\n”匹配换行符。序列“\\”匹配“\”,“\(”匹配“(”。^匹...

    小小科
  • 正则表达式全集

    week
  • Vim中查找替换及正则表达式的使用详解

    正则表达式是文本处理领域中的一个强大的工具,它可以让文本处理的能力呈指数级的提升,如果一款文本编辑器不支持正则表达式,那么它就算不上是一个现代化的编辑器,这绝非...

    砸漏
  • regular expression

    A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'。

    radaren
  • cools1 c105 救砖文件

    链接:https://pan.baidu.com/s/1S6EltBL-HvaXgFpGHmzK9Q 提取码:j3jg

    impdx-忧郁的派大星
  • Truffle以太坊合约部署实战

    •内置智能合约编译、连接、开发和二进制管理•快速开发的自动化合约测试•脚本、可扩展性部署和迁移框架•用于部署到任意数量的公网和私网的网络管理•为合约通信提供交互...

    Tiny熊

扫码关注云+社区

领取腾讯云代金券