字符串处理利器-正则表达式

正则表达式

一、常见的符号的介绍

  1.1 预定义字符类

符号 说明
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
**** 转义字符,比如"\"匹配"" ,"{"匹配"{"。

  1.2 数量词

符号 说明
* 等价于{0,} 匹配0至多个在它之前的字符。例如正则表达式“zo”能匹配“z”以及“zoo”;正则表达式“.”意味着能够匹配任意字符串。
+ 等价于{1,} 匹配前面的子表达式一次或多次。例如正则表达式9+匹配9、99、999等。
? 等价于{0,1} 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。此元字符还有另外一个用途,就是表示非贪婪模式匹配,后边将有介绍
{n} 匹配确定的 n 次。例如,“e{2}”不能匹配“bed”中的“d”,但是能匹配“seed”中的两个“e”。
{n,} 至少匹配n次。例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配“seeeeeeeed”中的所有“e”。
{n,m} 最少匹配 n 次且最多匹配 m 次。“e{1,3}”将匹配“seeeeeeeed”中的前三个“e”。

  1.3 边界匹配符号

符号 说明
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾

   1.3 其他常见符号

[]的使用--或 说明
[] 匹配括号中的任何一个字符
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
()的使用 -- 组`
() 将 () 之间括起来的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。捕获组可以通过从左到右计算其开括号来编号。
(\d) 第一组
((A)(B(C))) 第一组 ((A)(B(C))) 第二组 (A) 第三组(B(C)) 第四组(C)

二.正则表达式的示例

public class Test {
    public static void main(String[] args){
        //简单认知正则表达式的概念
        p("abc".matches("..."));
        p("a8729a".replaceAll("\\d", "-"));

        Pattern p = Pattern.compile("[a-z]{3}");
        Matcher m = p.matcher("fgh");

        p(m.matches());

        p("fgha".matches("[a-z]{3}"));

        //初步认识 . * + ?
        p("----------------初步认识-----------------");
        p("a".matches("."));//true
        p("aa".matches("aa"));//true
        p("aaaa".matches("a*"));//true
        p("aaaa".matches("a+"));//true
        p("".matches("a*"));//true
        p("aaaa".matches("a?"));//false
        p("".matches("a?"));//true
        p("213442142342".matches("\\d{3,100}"));//true
        p("192.168.0.aaa".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"));//false
        p("192".matches("[0-2][0-9][0-9]"));

        //范围
        p("-------------范围------------");
        p("a".matches("[abc]"));//true
        p("a".matches("[^abc]"));//false
        p("A".matches("[a-zA-Z]"));//true
        p("A".matches("[a-z]|[A-Z]"));//true
        p("A".matches("[a-z[A-Z]]"));//true
        p("R".matches("[A-Z&&[RFG]]"));//true

        //认识 \s \w \d
        /**在正则表达式里两个\\会被当成一个反斜杠  **/
        p("认识 \\s\\w\\d");
        p(" \n\r\t".matches("\\s{4}"));
        p(" ".matches("/S"));
        p("a_8".matches("\\w{3}"));
        p("abc888&^%".matches("[a-z]{1,3}\\d+[&^#%]+"));
        p("\\".matches("\\\\"));

        //boundary
        p("-----------------boundary-----------------");
        p("hello sir".matches("^h.*"));
        p("hello sir".matches(".*ir$"));
        p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));
        p("hellosir".matches("^h[a-z]{1,3}o\\b.*"));
        //white line
        p(" \n".matches("^[\\s&&[^\n]]*\\n$"));

        //email
        p("----------------email--------------");
        p("[email protected]".matches("[\\w[.-]][email protected][\\w[.-]]+\\.\\w+"));

        //matches find lookingAt
        p("------matches find lookingAt");
        Pattern p1 = Pattern.compile("\\d{3,5}");
        String s = "123-2345-234-00";
        Matcher m1 = p1.matcher(s);
        p(m1.matches());
        m1.reset();
        p(m1.find());
        //找的到 才会返回 start 起始位置 和 终止位置 找不到则报错
        p(m1.start() + "-" + m1.end());
        p(m1.find());
        p(m1.start() + "-" + m1.end());
        p(m1.find());
        p(m1.start() + "-" + m1.end());
        p(m1.find());

        p(m1.lookingAt());

        //replacement
        p("----------------replacement----------------");
        Pattern p3 = Pattern.compile("java",Pattern.CASE_INSENSITIVE);
        Matcher matcher3 = p3.matcher("java JaVa ashfaks JAVA iloveJAva youhatejAVA DAFAD");
        //p(matcher3.replaceAll("JAVA"));
        StringBuffer buf = new StringBuffer();
        int i = 1;
        while(matcher3.find()){
            if(i % 2 == 0){
                matcher3.appendReplacement(buf, "java");
            }else{
                matcher3.appendReplacement(buf, "JAVA");
            }
            i++;
        }
        matcher3.appendTail(buf);
        p(buf);

        //group
        p("--------------group------------");
        Pattern gp = Pattern.compile("(\\d{3,5})([a-z]{2})");
        String str = "123aa-34345bb-234cc-00";
        Matcher gm = gp.matcher(str);
        while(gm.find()){
            p(gm.group());
        }
    }

    public static void p(Object o){
        System.out.println(o);
    }

}

原文地址:https://www.cnblogs.com/dwlovelife/p/9919392.html

时间: 2024-10-11 03:40:43

字符串处理利器-正则表达式的相关文章

PHP字符串处理与正则表达式

字符串 1. PHP中的字符串是一种基本数据类型,PHP对unicode没有本地支持. 2. 字符串可以可以通过花括号来访问每一个字符,并且每个花括号只能存放一个字符: ? ? $str = 'abcd';? ? $str{1} = 'change it';? ? echo $str; // accd 3. 双引号中变量内插解析,在双引号中的内容会被解析为字符串, ? ? 如果遇到$符号,则会贪婪解析一个尽可能多的合法变量名,使用花括号可以将变量名括起来: ? ? 在双引号中解析数组索引或者对象

【原】Java学习笔记023 - 字符串缓冲区_正则表达式

1 package cn.temptation; 2 3 import java.util.Arrays; 4 5 public class Sample01 { 6 public static void main(String[] args) { 7 // 因为字符串创建后就不能修改,导致在进行字符串拼接时,会产生大量的中间字符串,创建对象都是需要消耗资源 8 // 所以,能不用字符串的直接拼接尽量不使用 9 10 // 字符串缓冲区:StringBuffer类/StringBuilder类

第四章 字符串操作与正则表达式(5)

******** 4.6 正则表达式的介绍 (from book < PHP & MySQL Web Development>)PHP 支持两种格式的正则表达式语法:POSIX 和 Perl.用途:完成复杂的模式匹配.难度:难******** 4.6.1 基础知识 ****** 定义:正则表达式是一种描述一段文本模式的方法. 类比:strstr()函数,是在一个字符串的某个位置(如果不指明则可能在字符串中的任何位置)匹配另一个字符串. 例子:字符处"shop"匹配正

Day3_字符串操作与正则表达式

本节课的主要内容有:字符串的格式化.连接与分割.比较.匹配和替换.使用正则表达式 字符串的格式化: 去除空格:trim() 使用html格式化:nl2br()  替换‘\n’为‘<br />’ 打印格式化:printf() 大小写:strtoupper() strtolower() ucfirst() ucwords() 特殊字符转义:addlashes() striplashes() 连接与分割字符串 按指定分隔符分隔:explode() 分隔字符串到数组; strtok()查找当前分隔出的

字符串不是正则表达式

上个月写那段处理CVS文件中的逗号的小程序时,顺便写了个测试程序.测试程序先读一“|”分割字段的文件.我们原来的程序中,都是使用Java中的 StringTokenizer 类来处理读入的每行数据.我的测试程序中改用String.split()方法,但是处理一“|”分割字段的文件总是不正确.换成其它分隔符或者使用StringTokenizer就没问题.墨迹了好长时间也没找出问题. “大事不决问Google,内事不决问老婆”.老婆是指望不上了,她是做会计工作的.只好问Google.随便看了一篇文章

字符串处理与正则表达式

功能:将cmd中的netstat -n的输出作为原始字符串做整理. import console var f = io.popen("netstat -n" ) var str = f.read( -1 ); //直接输出中文会乱码,所以先转换 str2 = string.fromto(str,936,65001) f.close(); io.open(); //打开控制台 //io.print(str2); //输出全部结果 var m1 = string.match(str2,&q

具有相同模式的字符串,使用正则表达式组的提取和替换的案例

对具有相同模式的字符串内不同的组的提取怎样做呢,我是这样做的: 提取字符串:sourcetext:{name:john,data:[1,2,3],name:marry,data:[4,5,6]} 代码: Regex reg = new Regex(@"data:\[([\w|.|,]{1,})\]", RegexOptions.IgnoreCase); MatchCollection matches = reg.Matches(series); foreach (Match match

delphi验证‘数字字符串’地址的正则表达式验证function

uses PerlRegEx; function CheckSortKey(SortKey:string):Boolean;//验证排序数字字符串var PerlRegEx: TPerlRegEx;begin PerlRegEx := TPerlRegEx.Create(nil); PerlRegEx.Subject := SortKey; PerlRegEx.RegEx := '^\d{10}$'; Result := PerlRegEx.Match; PerlRegEx.Free; end;

开发小计之判断输入字符串类型(正则表达式)

#pragma mark - 正则表达式 - (BOOL)isMobileNumber:(NSString *)mobileNum { /** * 手机号码 * 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188 * 联通:130,131,132,152,155,156,185,186 * 电信:133,1349,153,180,189 */ NSString * MOBILE = @"^1(3[0-9]|5[0-35-