作为程序员之正则表达式

目录

  • 正则表达式
    • 基础语法
      • 标准字符集合
      • 自定义的字符集合
      • 多行、单行模式
    • 高级语法
      • 选择符和分组
      • 反向引用
      • 预搜索/零宽断言
    • 例子
      • 匹配邮箱

正则表达式

基础语法

标准字符集合

\D 和[^\d]意思一样,就是与 \d 相反

REG意义
\ddigital表示 0 到 9 之间任意的一个数字
\wworld表示任意一个字母或数字或下划线,不包含¥$%等
\sspace表示包括空格、制表符、换行符等空白字符中任意一个
.可以匹配任意一个字符

自定义的字符集合

REG意义
[ad# ]方括号表示匹配 a 或 d 或 # 或 空格
^[ad# ]表示除方括号以外的字符
[a-g]表示匹配 a 到 g 之间的字符,别和上面的混淆了
[^a-f,0-3]匹配除了 a - f 和 0 到 3以外的字符

匹配次数

REG意义
(\d){10}前面的规则重复匹配了10次
{n,m}表示至少重复n次,最多重复m次
{n,}至少n次
?同{0,1}
+同{1,}
*同{0,}

多行、单行模式

  1. 忽略大小写:ignorecase
  2. 单行模式:single line 整个串作为一个模板串
  3. 多行模式:multi line 模板串分为多个行

    字符边界/匹配位置

    REG意义
    ^与字符串开始的地方匹配
    $与字符串结束的地方匹配
    \b表示在边界处匹配字符,放在左右会不一样的结果

高级语法

选择符和分组

REG意思
\|表示‘或’的意思,匹配左边或右边
()对正则表达式分组,更好地组织匹配
(?:Expression)不把()组中匹配到的字符不保存到group中

反向引用

\nnn反向引用|把捕获的字符分组编号,左括号为一个分组

预搜索/零宽断言

也是匹配位置

很少用的

REG意义
(\w)(?=Expression)匹配以Expression匹配到的字符结尾的字符
(\w)(?!Expression)匹配不能以Expression匹配到的字符结尾的字符
(\w)(?<=Expression)位置前面可以匹配Expression
(\w)(?<!Expression)位置后面可以Expression

表达式 方向 说明
|GEG|意义|
|:----|----:|----:|
|(?=xxx)|正向预搜索(向右) 正向预搜索,判断当前位置右侧是否能匹配指定表达式 |
|(?!xxx) | 正向预搜索(向右) 正向预搜索否定,判断当前位置右侧是否不能够匹配指定表达式 |
|(?<=xxx)| 反向预搜索,反向预搜索,判断当前位置左侧是否能够匹配指定表达式|

例子

匹配邮箱

brdlianyao_org.gif
23170831-5d9e8c439750496fb2ffec7616fecb7b.jpg

要考虑的问题:

  1. 把@前面的给匹配了:(\w+)
  2. 匹配“.”:. (因为“.”表示任意字符,所以要转义一下才能匹配到“.”)
  3. 把@后面的域名给匹配了,要考虑多层域名的匹配
  4. 用户名和域名中的大小写
  5. 用户名中含有 “.”
  6. 并不允许用户名中出现”-“

第一版
没能匹配到用户名中有 ”.“的邮箱
(\w+)@(\w+)(\.[a-zA-Z]{2,5}){1,2}

2989389@qq.com
adfj32KddkfKJAD@163.com
ajdf23AKDJFO@yahoo.com.cn
akdjf239290@guet.org
KFADJSFOAJDSFOAEJ@GUET.EDU.CN

最终版


![](https://images0.cnblogs.com/blog/582013/201312/23170854-ccd9c8305e1d43e998a0240d67cdc1f2.jpg)
这个可以匹配用户名含有“.“的邮箱

package regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

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

    //正则表达式Pattern p = Pattern.compile("(\\w)+(\\.\\w+)*@(\\w)+((\\.\\w{2,3}){1,3})");//待匹配的字符串String str = "2989389@qq.com"+ "adfj32KddkfKJAD@163.com"+ "ajdf23AKDJFO@yahoo.com.cn"+ "akdjf239290@guet.org"+ "KFADJSFOAJDSFOAEJ@GUET.EDU.CN"+"23jka32ir.323dfj@qq.com"+"23rfasdf.com.@163.qq.com";//用正则表达式去匹配字符串Matcher m = p.matcher(str);int i = 0;//如果发现,m.find()则为truewhile(m.find()){//每一组匹配到的字符都被放到了group里System.out.println(m.group(0));i++;}System.out.println(i);
}

}


###中文字符###
**[\u4e00-\u9fa5]**
***###用正则表达式取出正则表达式中括号里的数据
![](http://images2015.cnblogs.com/blog/640685/201509/640685-20150901151130888-1768887603.png)

package atest;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Aa {
public static void main(String args[]) throws Exception {
// 用正则表达式把字符串中的浮点数提取出来
// "\d[.]\d" 不能处理 .t3
// “\(.*?\)” 也是可以的
Pattern p = Pattern.compile("[\d]+\.[\d]+");
String u = "Mv(2.50),Tl(3.25),3.t3,3.,3..,Tr(3.26),Bk(2.16)";
Matcher m = p.matcher(u);

    // 统计有多少个浮点数int i = 0;while (m.find()) {System.out.println(m.group());i++;}System.out.println(i);
}

}

###匹配IP地址###
> 1. 匹配:三个字符一个点 三个字符一个点 三个字符一个点 三个字符
> 2. IP地址<255
> 3. IP地址的数字不能以0开始,如:012.* 第一版:
```
((\d{1,3})\.){3}\d{1,3}
```
把562.264.351也匹配了,没能确定IP地址<255* 第二版(最终版)
```
(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
```
```/ ***    最简洁的IP判断正则表达式*  25[0-5]                     250-255*  2[0-4]\d                    200-249*  [01]?\d\d?                 000-199(0-9 \d)(10-99 \d\d)(100-99 1\d\d)*  ($|(?!\.$)\.)               结束 或者 不以.结束的加上.*  (?!^0{1,3}(\.0{1,3}){3}$)     排除 0.0.0.0 /^(?!^0{1,3}(\.0{1,3}){3}$)((25[0-5]|2[0-4]\d|[01]?\d\d?)($|(?!\.$)\.)){4}$/*  (?!^255(\.255){3}$)           排除 255.255.255.255*/ 
```###电话、手机号码##
> 固定电话7位数,包含0开头和”—”
> 移动电话11位数,以13或15开头```
(0\d{2,3}-\d{7,9})|(1[35]\d{9})
```
![](http://images2015.cnblogs.com/blog/640685/201509/640685-20150901221837544-1968355426.png)

package regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestCode {
public static void main(String[] args) {
Pattern p = Pattern.compile("(0\d{2,3}-\d{7,9})|(1[35]\d{9})");
String str = "15907877344"
+ "0774-1593849"
+ "13877477862"
+ "1555615951"
+ "6651651565151"
+ "13515a1dfa91w13"
+ "434$tfsf51asf51"
+ "8E94 WE8";
Matcher m = p.matcher(str);
while(m.find())
{
System.out.println(m.group(0));
}
}
}

````

所用到的工具是RegexBuddy
022028425952741.png

转载于:https://www.cnblogs.com/tianjintou/p/4695953.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript 的dateObj.getTime() 在为C#的获取方式

publicstringGetTime() { Int64 retval 0; DateTime st newDateTime(1970, 1, 1); TimeSpan t (DateTime.Now.ToUniversalTime() -st); retval (Int64)(t.TotalMilliseconds 0.5); returnretval.ToString(); } 在Net中的实际测试代码 MSScriptControl.Scri…

学习笔记(34):Python网络编程并发编程-异步调用与回调机制

立即学习:https://edu.csdn.net/course/play/24458/296452?utm_sourceblogtoedu 1.知识点&#xff1a;&#xff08;详细见代码注释&#xff09; 1&#xff09;同步调用&#xff1a; res1 pool.submit(ju,john1).result() 2&#xff09;异步调用 pool.submit(ju,john1) 3…

c和c++的结构体使用

一&#xff1a;结构体其实有两种初始化方式 1、直接把多有的变量在其内部通过形参传入到结构体中&#xff0c;结构体定义在程序的最开头是个全局变量&#xff1b;这个时候参数已经传入进来&#xff0c;在本文件中都可以直接使用该结构体的所有成员变量 2、先定义&#xff0c;…

python第三方库安装的各种方法(全网最全,最简单易懂)

使用镜像&#xff1a; pip install virtualenv -i https://pypi.douban.com/simple 国内源&#xff1a; pip install -i https://pypi.tuna.tsinghua.edu.cn/simple module_name 或 pip install -i https://pypi.douban.com/simple module_name 国内的镜像源来加速 pip inst…

Jmeter服务器监控插件使用

Jmeter服务器监控插件使用 Jmeter-Plugins支持CPU、Memory、Swap、Disk和Network的监控&#xff0c;在测试过程中更加方便进行结果收集和统计分析。 一、准备工作&#xff1a; 1、下载Jmeter-Plugins插件&#xff0c;下载Server端ServerAgent插件&#xff1b; 2、解压Jmeter-Pl…

以后遇见 visual studio的调试bug出错,直接查询错误代码;高效解决调试问题

1、例如遇到&#xff1a; 严重性 代码 说明 项目 文件 行 错误 LNK2005 "void __cdecl readFileList(class std::basic_string<char,struct std::char_traits<char>, class std::allocator<char> >,class std::vector<class s…

数据库导入导出命令

Oracle数据导入导出imp/exp 功能&#xff1a;Oracle数据导入导出imp/exp就相当与oracle数据还原与备份。 大多情况都可以用Oracle数据导入导出完成数据的备份和还原&#xff08;不会造成数据的丢失&#xff09;。 Oracle有个好处&#xff0c;虽然你的电脑不是服务器&#xff0c…

CCNA系列课程(4)交换技术

第四节课 交换技术杜飞2009-06-28咱们今天来看一下局域网交换技术&#xff0c;也称为层2交换技术&#xff0c;内容主要包括层2交换的工作原理、网络环路、如何利用Spanning-Tree Protocol 来解决网络环路、VLAN及VTP技术&#xff0c;闲话少说&#xff0c;书归正传。我们在…

python中yield的用法详解——最简单,最清晰的解释(转载)

首先&#xff0c;如果你还没有对yield有个初步分认识&#xff0c;那么你先把yield看做“return”&#xff0c;这个是直观的&#xff0c;它首先是个return&#xff0c;普通的return是什么意思&#xff0c;就是在程序中返回某个值&#xff0c;返回之后程序就不再往下运行了。看做…

extern 全局变量在不同的文件使用方法(static)

例如&#xff1a;1.c int k6&#xff1b; 想要在2.c中调用1.c的k 则在2.c中用extern k 声明一下就可以使用了&#xff1b; int c3; ck; 但是如果1.c中是这样定义的 static int k6; 想要在2.c中使用k时不允许的&#xff0c;static只能在本文件中使用&#xff0c;外部文件…

python学习之路基础篇(第八篇)

一、作业&#xff08;对象的封装&#xff09;     要点分析 1.封装&#xff0c;对象中嵌套对象 2.pickle,load,切记&#xff0c;一定要先导入相关的类二、上节内容回顾和补充      面向对象基本知识&#xff1a; 1.类和对象的…

Ubuntu实现树莓派交叉编译

一、交叉编译 在一个平台上生成另一个平台上的可执行代码。为什么要大费周折的进行交叉编译呢&#xff1f;一句话&#xff1a;不得已而为之。有时是因为目的平台上不允许或不能够安装所需要的编译器&#xff0c;而又需要这个编译器的某些特征&#xff1b;有时是因为目的平台上的…

python常用的第三方库总结

通用 urllib -网络库(stdlib)。requests -网络库。grab – 网络库&#xff08;基于pycurl&#xff09;。pycurl – 网络库&#xff08;绑定libcurl&#xff09;。urllib3 – Python HTTP库&#xff0c;安全连接池、支持文件post、可用性高。httplib2 – 网络库。RoboBrowser –…

ubuntu系统安装vscode教程

方法一&#xff1a; 依次输入如下命令 1、sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make 2、sudo apt-get update 3、sudo apt-get install ubuntu-make 4、umake ide visual-studio-code 提示输入a即可 方法二&#xff1a; 在windows系统下载安装包&#xff0c…

pydebugger

定义结构体from ctypes import *WORD c_ushort DWORD c_ulong LPBYTE POINTER(c_ubyte) LPTSTR POINTER(c_char) HANDLE c_void_pDEBUG_PROCESS 0x00000001 CREATE_NEW_CONSOLE 0x00000010class STARTUPINFO(Structure):_fields_ [("cb", DWORD),("lpR…

Vue2 源码漫游(一)

Vue2 源码漫游&#xff08;一&#xff09; 描述&#xff1a; Vue框架中的基本原理可能大家都基本了解了&#xff0c;但是还没有漫游一下源码。 所以&#xff0c;觉得还是有必要跑一下。 由于是代码漫游&#xff0c;所以大部分为关键性代码&#xff0c;以主线路和主要分支的代码…

神经网络中的反向传播算法

神经网络中的方向传播算法讲得复杂难懂。简单地说明它的原理&#xff1a; 神经网络&#xff1a;输入层&#xff0c;隐藏层&#xff0c;输出层。根据线性关系&#xff0c;激活函数&#xff0c;并最终根据监督学习写出误差表达式。此时&#xff0c;误差函数可写成&#xff0c;那么…

有限元笔记02:第三章

1.局部坐标到全局坐标变换 2.

bug__android studio 出现布局文件不提示,且点击代码不能跟踪代码

1&#xff0c;点击布局文件&#xff0c;出现 Cannot find declaration to go to ? 且 点击代码不能跟踪代码&#xff1f; 把 项目的build.gradle 中的 compileSdkVersion 23 版本设置最高。 apply plugin: com.android.applicationandroid { compileSdkVersion 23 b…

Mysql:This version of MySQL doesn’t yet support ‘LIMIT IN/ALL/ANY/SOME 错误解决

This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 错误解决 这次国庆节回来后的测试中&#xff0c;在一个Mysql表达式中使用嵌套查询&#xff0c;出现了这个错误。原因是内层select语句带有limit子句。 在网上查了下&#xff0c;有文章指出&#xff…