java 正则表达式

正则表达式在我眼中是一种非常强大的工具,可以判断输入的文本是不是与要求匹配,从输入的文件中提取关键信息等等,而在实验以及学习过程中,我接触到的使用的最多的功能就是判断字符串与要求的格式是否匹配,下面是一个超级简单的例子

Pattern p = Pattern.compile("\\w+");

Matcher m = p.matcher(INPUT);

这个语句判断的是INPUT的格式是否为一个或多个字符的形式(\\w+),如果是,那么 m.find()就为true,否则为false。

从这个例子类推,根据不同的正则格式的表达就可以匹配多种形式的字符串,下面是我选出来的比较常用的一些匹配格式:

正则字符            匹配字符串

\                          将下一字符标记为特殊字符、文本、反向引用或八进制转义符

.                          任意字符

*                          零次或多次匹配前面的字符或子表达式,例如,op* 匹配"opo"和"oppo"

+                         至少一次或多次匹配前面的字符或子表达式,例如,"op+"匹配"opp",不匹配"o"

^                          匹配输入字符串开始的位置

$                         匹配输入字符串结尾的位置

?                        零次或一次匹配前面的字符或子表达式

[xyz]                   字符集。匹配字符集中任一字符

x|y                       匹配 x 或 y

{n}                      是非负整数,正好匹配 n 次,例如:o{2}匹配"oppo"

[a-z]                   字符范围

[^a-z]                反向范围字符,匹配不在指定的范围内的任何字符

\d                     数字字符匹配

\D                    非数字字符匹配

\n                     换行符匹配

\s                     匹配任何空白字符

\S                     匹配任何非空白字符

\t                      制表符匹配

\w                    匹配任何字类字符

\W                   与任何非单词字符匹配

需要注意的是正则表达式同一字符的大小写不同匹配的字符串也会不同,而且一般如果小写匹配的是哪种字符,大写匹配的是哪种字符的反义,还有,一些字符本身在正则表达式里面就有特殊含义,比如.(匹配任意字符),那么在匹配"."这个字符的时候,就需要用到转义字符\\,也就是"\\."这种形式。




还有一个很好用的概念是捕获组,捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。

例如,正则表达式 (hey) 创建了一个单一分组,组里包含"h","e",和"y"。

捕获组通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个组:

((A)(B(C)))

(A)

(B(C))

(C)

可以通过调用 matcher 对象的 groupCount 方法来查看表达式有多少个分组。groupCount 方法返回一个 int 值,表示matcher对象当前有多个捕获组。

还有一个特殊的组(group(0)),代表整个表达式。不包括在 groupCount 的返回值中。




在pattern类中,compil()方法还可以接受一个很好用的标记参数,下面是这些标记参数与他们编译的效果

Pattern.CANON_EQ

当且仅当两个字符的"正规分解"都完全相同的情况下,才认定匹配。比如用了这个标志之后,表达式"a/u030A"会匹配"?"。默认情况下,不考虑"规范相等性"。

Pattern.CASE_INSENSITIVE(?i)

默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。这个标志能让表达式忽略大小写进行匹配。这个是非常常用的标记参数之一。在实验中也用到了,可以增强用户输入以及文本输入的容错性。

Pattern.COMMENTS(?x)

在这种模式下,匹配时会忽略(正则表达式里的)空格字符(不是指表达式里的"//s",而是指表达式里的空格,tab,回车之类)。这也是非常常用的标记参数之一。

Pattern.DOTALL(?s)

在这种模式下,表达式'.'可以匹配任意字符,包括表示一行的结束符。

Pattern.MULTILINE(?m)

在这种模式下,'^'和'$'分别匹配一行的开始和结束。此外,'^'仍然匹配字符串的开始,'$'也匹配字符串的结束。默认情况下,这两个表达式仅仅匹配字符串的开始和结束。这也是非常常用的标记参数之一。

Pattern.UNICODE_CASE(?u)

在这个模式下,如果你还启用了CASE_INSENSITIVE标志,那么它会对Unicode字符进行大小写不明感的匹配,默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。

Pattern.UNIX_LINES(?d)

在这个模式下,只有'/n'才被认作一行的中止,并且与'.','^',以及'$'进行匹配。



split()函数

这是实验里面用的次数相当多的一个函数了,它可以将字符串按照要求划分成一个字符串数组,比如,将"192.168.52.11"划分成一个大小为4,每个位置装一段数字的数组,只需要

input = "192.168.52.11";

String[] temp = input.split("\\.");

那么temp数组里面装的就分别是"192","168","52","11"。非常适用于要在一长串字符串里面按照格式划分查找信息。比如时间,比如在日志里面用"|"分开的各个信息,要找到属于哪个类,哪个方法,就会频繁的用到这个函数。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • 1.正则表达式介绍 正则表达式算起来也是一个很庞大的语言系统,在所有的开发语言中基本都支持正则表达式,它可以很方便...
    babybus_superdo阅读 2,560评论 3 6
  • Java的正则表达式讲解:(为了能看清,本文正则表达式用中文的句号代替英文句点) 英文句点符号:匹配单个任意字符。...
    红姑娘阅读 4,321评论 0 2
  • title: 用Java实现网络爬虫二之Java正则表达式tags: Java 网络爬虫 Spider Crawl...
    codingXiaxw阅读 886评论 0 3
  • 嘎吱,随着沉闷的声响,高一四班教室破旧的木门被人推开,却不见有人进来。此时教室里异常的安静,混杂着每个人的心跳声。...
    Adjani_my阅读 510评论 0 3
  • 本质是借钱炒股,方式有2种。一是将股市之外的资产做抵押,换取现金并投入股市。二是购买金融衍生品,或以股市的...
    cdgh阅读 165评论 0 0