java的正则表达式

正则表达

参考
正则表达式的一个
参考2

限定符

常用的限定符 方式
* 匹配前面的子表达式零次或多次
+ 匹配前面的子表达式一次或多次。
? 匹配前面的子表达式零次或一次。
{n} n 是一个非负整数。匹配确定的 n 次
{n,} n 是一个非负整数。至少匹配n 次。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次

常用这个代替 x*,零次或多次 ≡{0,} {n,m}表示前面的最少n次最多m次

定位符

常用的定位符 方式
^ 匹配输入字符串开始的位置
$ 匹配输入字符串结尾的位置。
\b 匹配一个字边界,即字与空格间的位置,常用来表示一个单词
\B 非字边界匹配。

\b 字符的位置是非常重要的。如果它位于要匹配的字符串的开始,它在单词的开始处查找匹配项。如果它位于字符串的结尾,它在单词的结尾处查找匹配项
Chapter 的开头三个字符: \bCha
匹配单词 Chapter 中的字符串 ter :ter\b

元字符 参考

常用的元字符 方式
\b 与一个字边界匹配;即字与空格间的位置。
\B
\d 数字字符匹配相当于[0-9]
\D 等效于 [^0-9]
\w 等效于 [A-Za-z0-9_,与以下任意字符匹配:A-Z、a-z、0-9 和下划线]
\ W 等效于 [^A-Za-z0-9_],与除 A-Z、a-z、0-9 和下划线以外的任意字符匹配。]
[xyz] [abc] 与“plain”中的“a”匹配,字符集,与任何一个指定字符匹配。

反向引用,类似于java正则中的group(1),便是正则第一个括号中的值

正则的表示是用 \数字 :\1

大小写是否区分

常用的元字符 方式
(?!) 不区分大小写sensitive(?!)caseless(?!)sensitive可匹配sensitiveCaSelessSENsentive
(?-i) 关闭不区分大小写,sensitive(?-!)caseless(?-!)sensitive只能匹配sensitivecaselesssensitive

通过举例子的方式来表达

需要转移的字符总结
实际操作
1、\| :两个\后面加|,表示匹配一个|,|属于元字符,java中\本身具有转义作用,则两次,在java中相当于前一个\是给后一个\转意的,然后在用\对|转意
2、[0-9]{1,} :表示数字 某位置上出现0-9上的数字,至少1次,{n,m},表示前面的至少出现n次最多m次
3、() : 表示一个子表达式的开始和结束,例如(\(\?:第)([1-9]{1,})(段\)\?),中(\?:第),这是一个子表达式, ([1-9]{1,})这是一个子表达式,(段\)这是一个子表达式
4、 . :匹配换行符\n之外的任何单字符、
5、^ :在方括号外,表示字符串开始位置,在方括号内表示的意思
6、| :或运算
7、章节的表示 : [1-9][0-9]*
8、 .* : .表示匹配任何单字符 *表示匹配前面的字符出现0次到多次
9、匹配一行文本的结束处的文本,请在正则表达式的结束处使用 $ 字符:Chapter [1-9][0-9]{0,1}$
10、若要匹配一行文本开始处的文本,请在正则表达式的开始使用 ^ 字符: ^Chapter [1-9][0-9]{0,1}
11、匹配单词 Chapter 的开头三个字符,因为这三个字符出现字边界后面: \bCha


java编写正则的过程

1、写一个特殊的字符串——正则表达式如a|f。
String reg1="(\$underscore[0-9]{1,}\$)|(\$bracket[1-9]{1,}\$)";
2、将正则表达式编译成一个模板:p
Pattern pattern = Pattern.compile(reg1);
3、用模板p去匹配字符串str。
Matcher matcher=pattern.matcher(str);]
4、之后拿着这个match可以做操作
match.find()配合appendReplacement(StringBuffer sb,string replace)迭代的方式替换原来的值
或 match.replaceFirst( string)
或match.replaceAll(string s)
或者match.find()配合match.group(int i) 迭代的取出每次匹配到的值i=0表示整个,i=1表示正则表达式(1)(2)(3)1所括起来的值

详细内容

详细介绍java正则

Pattern对象

1、Pattern对象表示经编译的正则表达式,静态的compile( )方法负责将表示正则表达式的字符串编译成Pattern对象Pattern pattern = Pattern.compile(string regx)
2、Pattern还有一个能快速判断能否在input里面找到regex的 static boolean matches(string regex, String input)
3、以及能返回String数组的split( )方法,它能用regex把字符串分割开来,这个要查看一下
4、Pattern Pattern.compile(String regex, int flag),这个方法后面有个flag是对正则表达式进一步加强表达

flag取值 作用
Pattern.CANON_EQ
Pattern.CASE_INSENSITIVE 这个标志能让表达式忽略大小写进行匹配
Pattern.COMMENTS 匹配时会忽略(正则表达式里的)空格字符
Pattern.DOTALL 在这种模式下,表达式'.'可以匹配任意字符,包括表示一行的结束符。默认情况下,表达式'.'不匹配行的结束符。
Pattern.MULTILINE 在这种模式下,''和'$'分别匹配一行的开始和结束。此外,''仍然匹配字符串的开始,'$'也匹配字符串的结束。
Pattern.UNICODE_CASE 在这个模式下,如果你还启用了CASE_INSENSITIVE标志,那么它会对Unicode字符进行大小写不明感的匹配。默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。
Pattern.UNIX_LINES 在这个模式下,只有'/n'才被认作一行的中止,并且与'.','^',以及'$'进行匹配。

Matcher对象,只要给Pattern.matcher(string regx )方法传一个字符串

1、boolean matches()
2、boolean lookingAt(),lookingAt( )的意思是Pattern匹配字符串的开头
3、boolean find(),的功能是发现CharSequence里的,与pattern相匹配的多个字符序列,find( )像一个迭代器.从头到尾扫描一遍字符串.
4、boolean find(int start),find( )是带int参数的,正如你所看到的,它会告诉方法从哪里开始找
5、String group(),Group是指里用括号括起来的,能被后面的表达式调用的正则表达式,Group 0 表示整个表达式,group 1表示第一个被括起来的group
find()可以看做递归,及从sourceString中查找查找符合正则表达式的stirng,然后group函数则显示这个值group(0)表示这个值,group(1)表示正则表达式用()括起来的第一个值
6、reset( )相当于给find()重新跳一个指针到头上去。 假若下面程序不reset()则第二个while没得输出

        while(matcher.find()){
            
            System.out.println(matcher.group());
        }
        matcher.reset();
        while (matcher.find()) {
            System.out.println("进来"+matcher.group());
            
        }

要记得String类型有个replace方法,可以逐个的替换值replace(matcher.group(0), matcher.group(2)),用着个和java的正则结合起来用


替换操作

替换操作三种可选方法
1、replaceFirst(String replacement)将字符串里,第一个与模式相匹配的子串替换成replacement。
2、replaceAll(String replacement),将输入字符串里所有与模式相匹配的子串全部替换成replacement。
3、appendReplacement(StringBuffer sbuf, String replacement),一般这个要配合match.find()函数来一个

//替换第一次匹配到的(?:第1段)?为xxxx
        String source="判断$bracket0$中(?:第1段)?运用了$bracket1$$underscore0$分析$bracket0$的本质(?:第2段)?(?:第3段)?";
        //在正则加的()()()后面用来group(1),group(2),group(3)的
        String reg="(\\(\\?:第)([1-9]{1,})(段\\)\\?)";
        Pattern pattern = Pattern.compile(reg); 
        Matcher matcher=pattern.matcher(source);
        String resultTemp1=matcher.replaceFirst("xxxx");
        System.out.println(resultTemp1);

  //替换匹配到的(?:第1段)?为xxxx
        String source="判断$bracket0$中(?:第1段)?运用了$bracket1$$underscore0$分析$bracket0$的本质(?:第2段)?(?:第3段)?";
        //在正则加的()()()后面用来group(1),group(2),group(3)的
        String reg="(\\(\\?:第)([1-9]{1,})(段\\)\\?)";
        Pattern pattern = Pattern.compile(reg); 
        Matcher matcher=pattern.matcher(source);
        String resultTemp1=matcher.replaceAll("xxxx");
        System.out.println(resultTemp1);

   //取出匹配到的(?:第1段),中的数字,并替换掉原来的(?:第1段)
        String source="判断$bracket0$中(?:第1段)?运用了$bracket1$$underscore0$分析$bracket0$的本质(?:第2段)?(?:第3段)?";
        //在正则加的()()()后面用来group(1),group(2),group(3)的
        String reg="(\\(\\?:第)([1-9]{1,})(段\\)\\?)";
        Pattern pattern = Pattern.compile(reg); 
        Matcher matcher=pattern.matcher(source);
        StringBuffer stringBuffer=new StringBuffer();
        //find递归
        while(matcher.find()){
            matcher.appendReplacement(stringBuffer, matcher.group(2));//正则表达式reg,第二个(),括起来的内容
        }
        System.out.println(stringBuffer.toString());

或者

String source="判断$bracket0$中(?:第1段)?运用了$bracket1$$underscore0$分析$bracket0$的本质(?:第2段)?(?:第3段)?";
        //在正则加的()()()后面用来group(1),group(2),group(3)的
        String reg="(\\(\\?:第)([1-9]{1,})(段\\)\\?)";
        Pattern pattern = Pattern.compile(reg); 
        Matcher matcher=pattern.matcher(source);
        String string=null;
        //find递归
        while(matcher.find()){
            string="("+matcher.group(2)+")";
            //利用String的类来做的replace,替换
            source=source.replace(matcher.group(0), string);        
        }
        System.out.println(source);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容

  • 1.正则表达式介绍 正则表达式算起来也是一个很庞大的语言系统,在所有的开发语言中基本都支持正则表达式,它可以很方便...
    babybus_superdo阅读 2,571评论 3 6
  • re模块手册 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以...
    喜欢吃栗子阅读 4,010评论 0 13
  • 原文地址 之前在http://shukuiyan.iteye.com/blog/507915文中已经叙述过这个问题...
    hmaccelerate阅读 863评论 0 1
  • 清明节的前一晚散步的时候在微信里和一米聊了几句,两个人约定第二天去开封溜达一圈,然后我继续走我的路,她则回家搜一下...
    林雅阅读 523评论 1 4
  • 你跨越光年之远 在暗夜里流浪 我见你时 暗淡如你 我转身离去 各生欢喜
    a32b0dfe39b2阅读 146评论 0 0