Java-0007-正则表达式

2016.7.15

slipt(String regex)和replaceAll(String regex,String replacement)

上面是拼接字符串时常用的两种方法,它们的匹配参数字符串都是正则表达式的字符串,regex就是正则表达式。

处理字符串的时候,如果能够灵活熟练的使用正则表达式,就可以很方便的对程序表达出你的匹配逻辑,而不用写一大堆逻辑判断、复杂处理,还很容易出错和匹配不全。

正则表达式中一些字符已经被赋予了特殊的含义,想要匹配他们就要使用转义字符。

例如想匹配+加号,就需要用\+,但是我们又是用字符串来输入这个正则表达式,字符串中\也是转义字符,所以我们需要用\\来表示\,即匹配+加号,我们需要用\\+。

  //当代码为
  String str = "abc+xyz";
  str=str.replaceAll("+", "-");
  System.out.println(str);
  //运行结果为异常
  Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '+' near index 0

  //当代码为
  String str = "abc+xyz";
  str=str.replaceAll("\\+", "-");
  System.out.println(str);
  //运行结果为
  abc-xyz

例如你想替换字符串"This is good."中的"is"单词为"is not",那显然不能直接匹配"is"。
如果用一般的逻辑去写,首先要检查是否存在"is"单词,这就要考虑它的前后是否全为非字母或没有字符;
然后最好要一起替换所有的"is",但显然很难一起替换,那就依次替换,依次替换就需要有所有"is"单词的索引,替换一次后字符串长度又会变,索引也要相应的增长;
替换完后,返回新的字符串。

这样是不是感觉很麻烦,脑子有点混乱。
如果我们用上正则表达式就很不一样了,会轻松很多。

  return str.replaceAll("\\bis\\b", "is not");

\b代表了一个单词的边界,我们将它们组合起来\bis\b就是is单词了,以为以字符串输入,所有要在转义把\一下,regex就是"\\bis\\b".
看,是不是逻辑很清晰,方法很简单。
当然前提是你能组合出组合匹配条件的正则表达式。

一些常用的转义字符


转义字符 意义
\+ 加号
\.
\? 问号
\* 星号
\\ 反斜杠
\( \) 圆括号
\[ \] 方括号
\{ \} 大括号
竖线
\$ 美元
\^ 乘方
\t 间隔 ('\u0009')
\n 换行 ('\u000A')
\r 回车 ('\u000D')
\d 数字 等价于 [0-9]
\D 非数字 等价于 [^0-9]
\s 空白符号 [\t\n\x0B\f\r]
\S 非空白符号 [^\t\n\x0B\f\r]
\w 单独字符 [a-zA-Z_0-9]
\W 非单独字符 [^a-zA-Z_0-9]
\f 换页符
\e Escape
\b 一个单词的边界
\B 一个非单词的边界
\G 前一个匹配的结束

^ 为限制开头

^java  条件限制为以 Java 为开头字符

$ 为限制结尾

java$  条件限制为以 java 为结尾字符

. 为限制除 \n 以外任意一个单独字符

java..  条件限制为 java 后除换行外任意两个字符

加入特定限制条件「 [] 」

[a-z]    条件限制在小写 a to z 范围中一个字符
[A-Z]    条件限制在大写 A to Z 范围中一个字符
[a-zA-Z]   条件限制在小写 a to z 或大写 A to Z 范围中一个字符
[0-9]    条件限制在小写 0 to 9 范围中一个字符
[0-9a-z]   条件限制在(小写 0 to 9 或 a to z )范围中一个字符
[0-9[a-z]]  条件限制在(小写 0 to 9 )或 (小写 a to z )范围中一个字符 ( 交集 )

[] 中加入 ^ 后加再次限制条件「 [^] 」

[^a-z]    条件限制在非小写 a to z 范围中一个字符
[^A-Z]    条件限制在非大写 A to Z 范围中一个字符
[^a-zA-Z]  条件限制在非小写 a to z 或大写 A to Z 范围中一个字符
[^0-9]    条件限制在非小写 0 to 9 范围中一个字符
[^0-9a-z]  条件限制在非(小写 0 to 9 或 a to z )范围中一个字符
[^0-9[a-z]]  条件限制在(非小写 0 to 9 )或 (小写 a to z )范围中一个字符 ( 交集 )

在限制条件为特定字符出现 0 次以上时,可以使用「 * 」

J*   0 个以上 J
.*   0 个以上任意字符
J.*D  J 与 D 之间 0 个以上任意字符

在限制条件为特定字符出现 1 次以上时,可以使用「 + 」

J+   1 个以上 J
.+   1 个以上任意字符
J.+D  J 与 D 之间 1 个以上任意字符

在限制条件为特定字符出现有 0 或 1 次以上时,可以使用「 ? 」

JA?   J 或者 JA 出现

限制为连续出现指定次数字符「 {a} 」

J{2}  JJ
J{3}  JJJ

字符连续出现a个及以上 「 {a,} 」

J{3,}  JJJ,JJJJ,JJJJJ,??? (3 次以上 J 并存 )

字符连续出现a个及以上,b及个以下 「 {a,b} 」

J{3,5}  JJJ 或 JJJJ 或 JJJJJ

两者取一 「 | 」

J|A      J 或 A
Java|Hello  Java 或 Hello

学习文章:关于java中split的使用
学习文章:java 需要转义的一些特殊符号。
学习文章:JAVA中转义字符


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

推荐阅读更多精彩内容