正则表达式(一)

  正则表达式是一种强大而灵活的文本处理工具。使用正则表达式,我们能够以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索。找到匹配这些模式的部分就可以对它处理。正则表达式提供了一种完全通用的方式,能够解决各种字符串处理相关的问题:匹配、选择、编辑以及验证。

1、基本语法

字符:
B                 指定字符B
\xhh             十六进制为oxhh的字符
\uhhhh            十六进制表示为oxhhhh的Unicode字符
\t                制表符Tab
\n                换行符
\r                回车
\f                换页
\e                转义


字符类:
.                 任意字符
[abc]             包含a、b、c的任意字符(同a|b|c)
[^abc]            除了a、b、c之外的任意字符(否定)
[a-zA-z]          a-z或者A-Z的任意字符(范围)
[abc[hij]]        同a|b|c|h|i|j。合并
[a-z&&[hij]]      任意h、i或j(交)
\s                空白符(空格、tab、换行、换页和回车)
\S                非空白符([^\s])
\d                数字[0-9]
\D                非数字[^0-9]
\w                词字符[a-zA-Z0-9]
\W                [^\w]


逻辑操作符:
XY                Y跟在X后面
X|Y               X或者Y
(X)               捕获组。可以在表达式中用\i引用第i个捕获组


边界匹配符
^                一行的起始
$                一行的结束
\b               词的边界
\B               非词的边界
\G               前一个匹配的结束

2、应用正则表达式的最简单的途径,就是利用String类内建的功能。先来看一个例子:

1 public class IntegerMatch {
2     public static void main(String[] args) {
3         System.out.println("-1234".matches("-?\\d+"));
4         System.out.println("5678".matches("-?\\d+"));
5         System.out.println("+911".matches("-?\\d+"));
6         System.out.println("+911".matches("(-|\\+)?\\d+"));
7     }
8 }

输出:

true
true
false
true

本例中前两个字符串对应的正则表达式,匹配成功。第三个字符串开头有一个“+”,他也是一个整数,但与正则表达式却不匹配,所以应该用第四个正则描述:

(-|\\+)? :表示可能有一个“+”或“-”或无符号开头。其中"()"表示分组,"|"表示或。因为"+"在正则表达式中有着特殊的含义,所以必须使用\\进行转义成一个普通字符。

3、split()方法,String类自带一个非常有用的正则表达式工具--split()方法,其功能是将字符串从正则表达式匹配的地方切开。

 1 public class Splitting {
 2     public static String str =
 3             "Then, when you have found the shrubbery, you must " +
 4             "cut down the mightiest tree in the forest... " +
 5             "with... a herring!";
 6     public static void split(String regex){
 7         System.out.println(Arrays.toString(str.split(regex)));
 8     }
 9     public static void main(String[] args) {
10         split(" ");
11         split("\\W+");
12         split("n\\W+");
13     }
14 }

输出:

[Then,, when, you, have, found, the, shrubbery,, you, must, cut, down, the, mightiest, tree, in, the, forest..., with..., a, herring!]
[Then, when, you, have, found, the, shrubbery, you, must, cut, down, the, mightiest, tree, in, the, forest, with, a, herring]
[The, whe, you have found the shrubbery, you must cut dow, the mightiest tree i, the forest... with... a herring!]

  首先看第一个语句,按空格划分字符串。

  第二个和第三个都有用到了\W (非单词字符),通过第二个可以看到,它将标点字符删除了。第三个表示"字母n后面跟着一个或者多个非单词字符",可以看到,在原始字符中,与正则表达式匹配的部分,在最终的结果中都不存在了。

  String.split()还有一个重载的版本,增加了限制字符串分割次数的参数。

4、替换方法,String类自带的最后一个正则表达式工具是"替换"。可以选择只替换正则表达式第一匹配的字串也可以替换所有匹配的地方。

1 public class Replacing {
2     static String s = Splitting.str;//接上个类Splitting
3     public static void main(String[] args) {
4         System.out.println(s.replaceFirst("f\\w+", "located"));//替换第一个匹配成功的字串
5         System.out.println(s.replaceAll("shrubbery|tree|herring", "banana"));//替换所有匹配成功的字串
6     }
7 }

输出:

Then, when you have located the shrubbery, you must cut down the mightiest tree in the forest... with... a herring!
Then, when you have found the banana, you must cut down the mightiest banana in the forest... with... a banana!

  第一个表达式匹配以字母f开头,后面跟一个或多个字母。只替换第一匹配的部分,所以"found"被替换成"located"。

  第二个表达式要匹配的是三个单词中的任意一个,并替换掉所有匹配的部分。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏互联网开发者交流社区

JSP语法

1145
来自专栏思考的代码世界

Python基础学习00天

1123
来自专栏深度学习思考者

Python学习(二) 正则表达式

Python正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。re 模块使 Python 语言拥有全部的正则表达式功...

1889
来自专栏程序员互动联盟

【答疑释惑】main函数的参数是哪里传递来的

int main(int argc, char *argv[]) 这个参数是哪里传递来的? C/C++语言中的main函数,经常带有参数argc,argv,如下...

2748
来自专栏流柯技术学院

正则中需要转义的特殊字符

862
来自专栏编程

Python读书笔记5

上期分享了Python相关的字符串应用,重点分享了转义字符。今天和大家分享和字符串相关的函数和应用。 一、字符串的合并! Python用“+”号可以连接两个文本...

1767
来自专栏代码世界

Python之re模块

re模块 在Python中想要使用正则表达式,就需要调用re模块来实现。 在 re 模块下的常用方法: 调用时程序最上面需要写 import re 常用的几个关...

33913
来自专栏技术之路

c++ 头文件

可以将程序分为二部分: 头文件:包含结构声明和使用这些结构的函数的原型 源代码文件: 包含与结构有关的函数的代码 不要将函数的定义或变量的声明放在头文件里, 一...

1778
来自专栏Pythonista

Go语言结构

在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。

881
来自专栏一枝花算不算浪漫

[jQuery学习系列一]1-选择器与DOM对象

33911

扫码关注云+社区