JAVA 正则表达式

一、语法驱动的构造

  1. 基于I/O的输入流 应用需要从外部读取文本数据, 在应用中做进一步处理。 具体来说,读取的一个字节或字符序列可能是:

    • 输入文件有特定格式,程序需读取文件并从中抽取正确的内容。

    • 从网络上传输过来的消息,遵循特定的协议。

    • 用户在命令行输入的指令,遵顼特定的格式。

    • 内存中存储的字符串,也有格式需要。

  2. 语法

    • 使用grammar判断字符串是否合法,并解析成程序里使用的数据结构

    • 正则表达式

    • 通常是递归的数据结构

1.1 语法的组成成分

  1. 终止节点:语法中的文字字符串

    • 用语法定义一个“字符串”

    • terminals 终止节点、叶节点

    • nonterminal 非终止节点(遵循特定规则,利用操作符、终止节点和其他非终止节点,构造新的字符串)

  2. 语法中的产生式节点和非终止节点

    • 语法是由一系列产生式节点组成,每一个产生式节点定义了一个非终止节点

    • 非终止节点就像代表一组字符串的变量,而产生式节点是根据其他变量(非终结符),运算符和常量(终结符)来定义该变量。 遵循特定规则,利用操作符,终止中断和其他非终止中断,构造新的字符串

    • 非终结符是树的内部节点,代表一个字符串。

  3. 语法中的产生式节点具有以下形式:

    • nonterminal :: =产生式节点、非终止节点和运算符的表达式

    • 语法的非终结符之一被指定为词根

    • 语法识别的字符串集是与根非终结符匹配的字符串

    • 该非终结符通常称为root或start

1.2 语法中的操作符

  1. 三个基本语法的操作符

    • 连接,不是通过一个符号,而是一个空间: x ::= y z //x等价于y后跟一个z

    • 重复,以*表示: x ::= y* // x等价于0个或更多个y

    • 联合,也称为交替,用|表示 : x ::= y | z //x等价于一个y或者一个z

  2. 三个基本操作符的组合:

    • 可选(0或1次出现),由?表示: x ::= y? //x等价于一个y或者一个空串

    • 出现1次或多次:以+表示: x ::= y+ //x等价于一个或者更多个y, 等价于 x ::= y y*

    • 字符类[…],表示长度的字符类,包含方括号中列出的任何字符的1个字符串: x ::= [abc] //等价于 x ::= 'a' | 'b' | 'c'

    • 否定的字符类…,表示长度,包含未在括号中列出的任何字符的1个字符串: x ::= abc //等价于 x ::= 'd' | 'e' | 'f' | ... (all other characters in Unicode)

  3. 例子: x ::= (y z | a b)* //an x is zero or more y z or a b pairs m ::= a (b|c) d //an m is a, followed by either b or c, followed by d

1.3 语法分析树

  1. 语法分析树: 将语法与字符串匹配可以生成一棵分析树,该树显示字符串的各个部分与语法的各个部分如何对应。

    • 解析树的叶子用终端标记,表示已解析的字符串部分。

    • 没有孩子,无法继续扩大。

    • 如果将叶子串联在一起,则返回原始字符串。

  2. 解析URL示例: url ::= protocol '\: //' hostname (':'port)? '/' protocol ::= ('f' | 'ht') 'tp' 's'? hostname ::= word '.' hostname | word '.' word port ::= [0-9]+ word ::= [a-z]+

1.4 正则语法

  1. 正则语法: 简化之后可以表达为一个产生式而不包含任何非终止节点。

  2. 正则语法示例:

图2-1 正则语法

1.5 正则表达式

  1. 正则表达式: 可以用一种更紧凑的形式来编写简化的终端和运算符表达式。

  2. 正则表达式消除了终端周围的引号以及终端和操作符之间的空格,因此它仅由终端字符,分组括号和操作符组成。 去除引号和空格,从而表达更简洁(更难懂),正则表达式也简称为regex。

    • 正则表达式比原始语法的可读性差得多,因为它缺少记录每个子表达式含义的非终结符名称。

    • 但是正则表达式可以快速实现,并且许多编程语言中都有支持正则表达式的库。

  3. 正则表达式中的特殊字符

图2-2 正则表达式中的特殊字符

  1. 上下文无关文法 与课程形式语言与自动机关联

1.6 JAVA中的正则表达式

  1. 适用场合:我们用正则表达式匹配字符串(例如 String.split , String.matches , java.util.regex.Pattern)

    • 用一个空格代替所有的多个空格

    • 匹配一个URL:

    • 提取HTML标签的一部分

图2-3 JAVA中使用正则表达式示例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值