正则表达式问题清单

正则表达式规则

  • 正则表达式
    正则表达式是一种特殊的字符串模式,用于匹配一组字符串

贪婪量词
“*”(贪婪) 重复零次或更多
“+”(懒惰) 重复一次或更多次
“?”(占有) 重复零次或一次
“{n}” 重复n次
“{n,m}” 重复n到m次
“{n,}” 重复n次或更多次

懒惰限定符
“*?” 重复任意次,但尽可能少重复
“+?” 重复1次或更多次,但尽可能少重复
“??” 重复0次或1次,但尽可能少重复
“{n,m}?” 重复n到m次,但尽可能少重复
“{n,}?” 重复n次以上,但尽可能少重复

元字符
“^” :^会匹配字符串的起始位置
" " : " : "会匹配字符串的结尾
“\w”:匹配字母,数字,下划线.
“\d”: 匹配数字
“\b” : 匹配单词边界
“\s”:匹配空格
[a-z]匹配a至z的所有字母

几种反义
写法很简单改成大写就行了,意思与原来的相反,这里就不举例子了
“\W” 匹配任意不是字母,数字,下划线 的字符
“\S” 匹配任意不是空白符的字符
“\D” 匹配任意非数字的字符
“\B” 匹配不是单词开头或结束的位置
“[^abc]” 匹配除了abc以外的任意字符

捕捉分组
String line = “This order was placed for QT3000! OK?”;
String pattern = "(\D*)(\d+)(.)";
// 创建 Pattern 对象
Pattern r = Pattern.compile(pattern);
// 现在创建 matcher 对象
Matcher m = r.matcher(line);
if (m.find( )) {
则打印: m.group(0),m.group(1),m.group(2) ,m.group(3)
}
结果如下:【0组是整个字符串,1是匹配3000
以前的,剩下的就是3000! OK?,2组就是在3000! OK?的基础上进行匹配,3组把3000匹配了,4组就是在! OK?里面去继续匹配字符】在这里插入图片描述

正则表达式中的字符含义

字符描述:   
^ :匹配输入的开始位置。   
\:将下一个字符标记为特殊字符或字面值。   
* :匹配前一个字符零次或几次。   
+ :匹配前一个字符一次或多次。   
(pattern) 与模式匹配并记住匹配。   
x|y:匹配 x 或 y。   
[a-z] :表示某个范围内的字符。与指定区间内的任何字符匹配。   
\w :与任何单词字符匹配,包括下划线。   
$ :匹配输入的结尾。  

匹配邮箱和电话号码

public class Main {
    public static void main(String[] args) {

        /**
         *    合法E-mail地址:   
         *         1. 必须包含一个并且只有一个符号“@”   
         *         2. 第一个字符不得是“@”或者“.”   
         *         3. 不允许出现“@.”或者.@   
         *         4. 结尾不得是字符“@”或者“.”   
         *         5. 允许“@”前的字符中出现“+”   
         *         6. 不允许“+”在最前面,或者“+@”
         */

        //电子邮件  
        String check = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
        Pattern regex = Pattern.compile(check);
        Matcher matcher = regex.matcher("d12@.23few.@");
        boolean isMatched = matcher.matches();
        System.out.println(isMatched);

        /* 电话号码 
         
        String check = "^(13[4,5,6,7,8,9]|15[0,8,9,1,7]|188|187)\\d{8}$"; 
         Pattern regex = Pattern.compile(check); 
         Matcher matcher = regex.matcher("13555655606"); 
         boolean isMatched = matcher.matches(); 
         System.out.println(isMatched); 
         
        */
    }
}
1. 三个同样的字母连在一起,一定是拼写错误,去掉一个的就好啦:比如 helllo -> hello
2. 两对一样的字母(AABB型)连在一起,一定是拼写错误,去掉第二对的一个字母就好啦:比如 helloo -> hello
3. 上面的规则优先“从左到右”匹配,即如果是AABBCC,虽然AABB和BBCC都是错误拼写,应该优先考虑修复AABB,结果为AABCC

正则\1\2和\1的理解
原创liangf05 发布于2018-02-24 14:06:15 阅读数 11910 收藏
展开
正则表达式中
‘\1’ 匹配的是 字符 ‘\1’ 。 (因为 ‘\’ 匹配字符 ‘\’ )
‘\2’ 匹配的是 字符 ‘\2’
单独斜杠的 \1 , \2 就是反向引用了。
‘\1’ 匹配的是 所获取的第1个()匹配的引用。例如,’(\d)\1’ 匹配两个连续数字字符。如33aa 中的33
‘\2’ 匹配的是 所获取的第2个()匹配的引用。
例如,’(\d)(a)\1’ 匹配第一是数字第二是字符a,第三\1必须匹配第一个一样的数字重复一次,也就是被引用一次。如9a9 被匹配,但9a8不会被匹配,因为第三位的\1必须是9才可以,
‘(\d)(a)\2’ 匹配第一个是一个数字,第二个是a,第三个\2必须是第二组()中匹配一样的,如,8aa被匹配,但8ab,7a7不会被匹配,第三位必须是第二组字符的复制版,也是就引用第二组正则的匹配内容

以此类推
$1表示正则中第一对圆括号内匹配的内容
$2表示正则中第二对圆括号内匹配的内容

链接:https://www.nowcoder.com/questionTerminal/42852fd7045c442192fa89404ab42e92?orderByHotValue=1&page=1&onlyReference=false
来源:牛客网

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int line = scanner.nextInt();
        scanner.nextLine();
        for (int i = 0; i < line; i++) {
        /**
        *第一个正则把3个以上的字符换成2个,第二个正则把AABB型换成AAB型
        *
        */
            System.out.println(scanner.nextLine().replaceAll("(.)\\1+","$1$1").replaceAll("(.)\\1(.)\\2","$1$1$2"));
        }
    }
}
### 关于正则表达式的使用方法 正则表达式是一种强大的文本处理工具,广泛应用于字符串匹配、查找、替换等场景。以下是关于其具体用法的详细介绍: #### 1. 学习资源推荐 为了更好地掌握正则表达式的基本语法和高级技巧,可以通过以下途径深入学习: - **基础语法**:参考站内引用提供了丰富的学习资料[^1],其中包括《正则表达式基本语法》以及《正则表达式备忘清单》,这些文档可以帮助快速熟悉常见的元字符及其功能。 - **实践平台**:通过在线工具进行实际操作练习是非常有效的学习方式之一。例如,《正则表达式在线工具》允许用户实时测试自己的正则表达式并查看匹配结果。 #### 2. 或运算的应用 在正则表达式中,“或”逻辑通常由竖线 `|` 实现。它能够用来指定多种可能的情况。比如要寻找单词“cat”或者“dog”,可以写成如下形式: ```regex (cat|dog) ``` 此模式会尝试分别匹配两个子串中的任意一个[^2]。 #### 3. 数据提取技术 当涉及到复杂的数据抓取任务时,JMeter 的教程提供了一种有效的方法来定义捕获组,并利用 `$n$` 来获取特定部分的内容[^3]。这里 n 是指代第几组被捕获的信息序号;特别注意的是,编号从零开始计数,其中 $0$ 总是指向完整的匹配项而非单独的部分片段。 #### 示例代码展示如何编写简单的 Python 脚本来应用上述概念完成文件内的电话号码筛选工作: ```python import re text = """ Contact us at (123)-456-7890 or email@example.com. Alternatively, you can reach out to support@sample.org. """ phone_pattern = r'\(\d{3}\)-\d{3}-\d{4}' emails_pattern = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+' phones = re.findall(phone_pattern, text) emails = re.findall(emails_pattern, text) print("Phones:", phones) print("Emails:", emails) ``` 以上脚本展示了两种不同类型的模式——一种用于检测美国标准格式下的电话号码序列,另一种则是电子邮件地址验证器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值