正则表达式的语法
正则表达式语法简介 正则表达式是独立于任何语言的,虽然不同的语言中其语法略有不同。 正则表达式的语法可以分为• 特殊字符• 边界匹配符• 逻辑操作符• 量词等 这些基本的语法规则合成使用,共同构成了正则表达式强大的表示和匹配功能 一般字符的语法在前一节已经介绍过(例如字符i)特殊字符的表达 例如,如果我们要查找一个字符串,这个字符串中至少包含两行(两行可以不相邻),前面一行中存在两个制表
正则表达式语法简介
正则表达式是独立于任何语言的,虽然不同的
语言中其语法略有不同。
正则表达式的语法可以分为
• 特殊字符
• 边界匹配符
• 逻辑操作符
• 量词等
这些基本的语法规则合成使用,共同构成了正
则表达式强大的表示和匹配功能
一般字符的语法在前一节已经介绍过(例如字符i)
特殊字符的表达
例如,如果我们要查找一个字符串,这个字符
串中至少包含两行(两行可以不相邻),前面
一行中存在两个制表符,它们中间仅仅隔一数
字,后面一行中至少有一个制表符,则正则表
达式可以这样写:
• String regexString = “.\t\d\t.\n.\t.”
(其中的.表示任意多个非换行字符)
• 注意:正则表达式原文是“.\t\d\t.\n.\t.*” ,
双反斜杠中前一反斜杠是Java对反斜杠的转
义。
边界匹配符
例如,如果我们要判断一个完整文本中是否存在完
整的一行"This is a complete line",且行中没有其它
任何字符,则可以如下的正则表达式:
• String regexString = “^This is a complete line$”
• 其中的 ^ 和 $ 界定了行的起始和终止,中间的
信息必须完整匹配才可以。
逻辑操作符
例如,假设十六进制的表示字符是由数字和A-F这6个大写字母构成。我们知道一个字节可以用 2位的16进制表示,下面这个正则表达式要判断一个字节转换成十六进制之后的表示是不是正确:
• String regexString = “[0-9A-F][0-9A-F]”
字符串“ AE”, “30”, “6G”, “7E0”, “0A”匹配这个模式的结果分别是:T, T, F, F, T。其实这个需求还有更简单的实现方法,我们将在量词中介绍。
量词
量词 描述了一个模式怎样吸收输入的文本:
贪婪型:量词是贪婪的,除非有别的设定。否则,贪婪型模式就要尽可能地发现更多的匹配。
勉强型:用问号指定。这个量词需要满足匹配的最少字符数。
占有型:目前,只有Java语言可用,属于Java特殊语法,主要用途是防止失配时回溯。在简单的正则表达式中很少使用。
例如,判断一个字节的十六进制表示是否正确可以用下面的正则表达式:
• String regexString = “[0-9A-F]{2}”
判断一个字符串表示的数值是不是一个(0, 1亿)
之间的整数,可用:
• String regexString = “[1-9]//d{0,7}”
Java中的正则表达式(Regular Expression)是基于Perl 5的正则表达式语法,但也有一些Java特有的扩展。下面是一些Java正则表达式的基本语法和元素:
-
字符类(Character Classes):
.
:匹配任何字符(除了换行符)。[abc]
:匹配括号中的任一字符。[^abc]
:匹配不在括号中的任一字符。[a-z]
:匹配任何小写字母。[A-Z]
:匹配任何大写字母。[0-9]
:匹配任何数字。\d
:等同于[0-9]
,匹配任何数字。\D
:匹配任何非数字字符。\s
:匹配任何空白字符,包括空格、制表符、换页符等。\S
:匹配任何非空白字符。\w
:匹配任何单词字符,等同于[a-zA-Z_0-9]
。\W
:匹配任何非单词字符。
-
预定义字符类(Predefined Character Classes):
\t
:匹配制表符。\n
:匹配换行符。\r
:匹配回车符。\f
:匹配换页符。\e
:匹配转义字符。
-
边界匹配器(Boundary Matchers):
^
:行的开头。$
:行的结尾。\b
:单词边界。\B
:非单词边界。\A
:输入的开头。\G
:上一个匹配的结尾。\Z
:输入的结尾,但如果是换行符,则在换行符前匹配。\z
:输入的结尾。
-
数量词(Quantifiers):
X?
:X出现一次或零次。X*
:X出现零次或多次。X+
:X出现一次或多次。X{n}
:X恰好出现n次。X{n,}
:X出现n次或多次。X{n,m}
:X出现至少n次,但不超过m次。
-
逻辑运算符(Logical Operators):
XY
:X后跟Y。X|Y
:X或Y。(X)
:捕获组。
-
特殊构造(Special Constructs):
(?:X)
:非捕获组。(?=X)
:零宽度正预测先行断言。(?!X)
:零宽度负预测先行断言。(?<=X)
:零宽度正回顾后发断言。(?<!X)
:零宽度负回顾后发断言。(?>X)
:独立非捕获组(也称为“原子组”)。\Q...\E
:在…\E之间的任何字符都被视为字面字符。
-
反斜杠、转义和引用(Backslashes, Escapes, and Quoting):
\
:用作转义字符,例如\n
代表换行符。\Q...\E
:使\
之后的字符失去特殊含义。\\
:匹配\
字符本身。
在Java中,你可以使用java.util.regex
包中的Pattern
和Matcher
类来处理正则表达式。例如:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexExample {
public static void main(String[] args) {
String text = "Hello, World! 123";
String regex = "\\d+"; // 匹配一个或多个数字
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println("Found match: " + matcher.group());
}
}
}
在这个例子中,我们使用了正则表达式\\d+
来匹配文本中的一个或多个数字,并打印出所有匹配的结果。注意,在Java字符串中,\
是一个转义字符,所以当我们想要表示正则表达式中的\d
时,我们需要使用\\d
。
更多推荐
所有评论(0)