正则表达式规则

字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在。比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦,而且代码难以复用。

正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。

所以我们判断一个字符串是否是合法的Email的方法是:

  1. 创建一个匹配Email的正则表达式;

  2. 用该正则表达式去匹配用户的输入来判断是否合法。

因为正则表达式也是用字符串表示的,所以,我们要首先了解如何用字符来描述字符。

在正则表达式中,如果直接给出字符,就是精确匹配。用\d可以匹配一个数字,\w可以匹配一个字母或数字,所以:

  • '00\d'可以匹配'007',但无法匹配'00A'

  • '\d\d\d'可以匹配'010'

  • '\w\w\d'可以匹配'py3'

.可以匹配任意字符,所以:

  • 'py.'可以匹配'pyc''pyo''py!'等等。

要匹配变长的字符,在正则表达式中,用*表示任意个字符(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示n-m个字符:

来看一个复杂的例子:\d{3}\s+\d{3,8}

我们来从左到右解读一下:

  1. \d{3}表示匹配3个数字,例如'010'

  2. \s可以匹配一个空格(也包括Tab等空白符),所以\s+表示至少有一个空格,例如匹配' '' '等;

  3. \d{3,8}表示3-8个数字,例如'1234567'

综合起来,上面的正则表达式可以匹配以任意个空格隔开的带区号的电话号码。

如果要匹配'010-12345'这样的号码呢?由于'-'是特殊字符,在正则表达式中,要用'\'转义,所以,上面的正则是\d{3}\-\d{3,8}

但是,仍然无法匹配'010 - 12345',因为带有空格。所以我们需要更复杂的匹配方式。

进阶

要做更精确地匹配,可以用[]表示范围,比如:

  • [0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;

  • [0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100''0_Z''Py3000'等等;

  • [a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;

  • [a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。

A|B可以匹配A或B,所以[P|p]ython可以匹配'Python'或者'python'

^表示行的开头,^\d表示必须以数字开头。

$表示行的结束,\d$表示必须以数字结束。

你可能注意到了,py也可以匹配'python',但是加上^py$就变成了整行匹配,就只能匹配'py'了。





转载自廖雪峰的官方网站

成都市作为中国西部地区具有战略地位的核心都市,其人口的空间分布状况对于城市规划、社会经济发展及公共资源配置等研究具有基础性数据价值。本文聚焦于2019年度成都市人口分布的空间数据集,该数据以矢量格式存储,属于地理信息系统中常用的数据交换形式。以下将对数据集内容及其相关技术要点进行系统阐述。 Shapefile 是一种由 Esri 公司提出的开放型地理空间数据格式,用于记录点、线、面等几何要素。该格式通常由一组相互关联的文件构成,主要包括存储几何信息的 SHP 文件、记录属性信息的 DBF 文件、定义坐标系统的 PRJ 文件以及提供快速检索功能的 SHX 文件。 1. **DBF 文件**:该文件以 dBase 表格形式保存与各地理要素相关联的属性信息,例如各区域的人口统计数值、行政区划名称及编码等。这类表格结构便于在各类 GIS 平台中进行查询与编辑。 2. **PRJ 文件**:此文件明确了数据所采用的空间参考系统。本数据集基于 WGS84 地理坐标系,该坐标系在全球范围内广泛应用于定位与空间分析,有助于实现跨区域数据的准确整合。 3. **SHP 文件**:该文件存储成都市各区(县)的几何边界,以多边形要素表示。每个多边形均配有唯一标识符,可与属性表中的相应记录关联,实现空间数据与统计数据的联结。 4. **SHX 文件**:作为形状索引文件,它提升了在大型数据集中定位特定几何对象的效率,支持快速读取与显示。 基于上述数据,可开展以下几类空间分析: - **人口密度评估**:结合各区域面积与对应人口数,计算并比较人口密度,识别高密度与低密度区域。 - **空间集聚识别**:运用热点分析(如 Getis-Ord Gi* 统计)或聚类算法(如 DBSCAN),探测人口在空间上的聚集特征。 - **空间相关性检验**:通过莫兰指数等空间自相关方法,分析人口分布是否呈现显著的空间关联模式。 - **多要素叠加分析**:将人口分布数据与地形、交通网络、环境指标等其他地理图层进行叠加,探究自然与人文因素对人口布局的影响机制。 2019 年成都市人口空间数据集为深入解析城市人口格局、优化国土空间规划及完善公共服务体系提供了重要的数据基础。借助地理信息系统工具,可开展多尺度、多维度的定量分析,从而为城市管理与学术研究提供科学依据。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
### Java 正则表达式规则与使用指南 Java 中的正则表达式(Regular Expression)是一种强大的工具,用于匹配字符串中的字符模式。通过 `java.util.regex` 包中的 `Pattern` 和 `Matcher` 类,可以实现对字符串的搜索、替换和验证等功能[^1]。 #### 一、基本语法 正则表达式的语法包括普通字符、特殊字符和元字符。以下是常用的规则: - 普通字符:如字母、数字等直接匹配自身。 - 特殊字符:需要转义才能匹配其字面意义,例如 `\.` 匹配点号 `.`。 - 元字符:具有特殊含义的字符,例如 `*` 表示零次或多次匹配,`+` 表示一次或多次匹配,`?` 表示零次或一次匹配[^1]。 #### 二、导入相关类 在 Java 中使用正则表达式时,必须导入 `java.util.regex` 包中的类。以下是一个典型的导入语句: ```java import java.util.regex.Pattern; import java.util.regex.Matcher; ``` 这些类提供了创建正则表达式对象和执行匹配操作的功能[^2]。 #### 三、创建正则表达式对象 通过 `Pattern` 类可以编译一个正则表达式字符串为模式对象。例如: ```java Pattern pattern = Pattern.compile("^[a-zA-Z0-9_]+$"); ``` 此代码定义了一个匹配由字母、数字或下划线组成的字符串的正则表达式[^2]。 #### 四、编写不包含特定表达式的正则表达式 如果需要确保字符串中不包含某些字符或模式,可以通过否定字符集或逻辑排除实现。例如,以下正则表达式匹配不包含空格的字符串: ```java Pattern pattern = Pattern.compile("^[^\\s]+$"); ``` 这里,`[^\\s]` 表示匹配任何非空白字符[^3]。 #### 五、验证邮箱格式 验证邮箱格式是正则表达式的一个常见应用场景。以下是一个符合标准的邮箱验证正则表达式: ```java String emailRegex = "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$"; Pattern pattern = Pattern.compile(emailRegex); ``` 该表达式能够匹配大多数合法的电子邮件地址[^4]。 #### 六、使用 `Matcher` 进行匹配检查 `Matcher` 类用于执行匹配操作。以下是一个完整的示例,展示如何验证字符串是否符合指定的正则表达式: ```java Pattern pattern = Pattern.compile("^[a-zA-Z0-9_]+$"); Matcher matcher = pattern.matcher("test_user123"); boolean isMatch = matcher.matches(); System.out.println(isMatch); // 输出 true 或 false ``` #### 七、替换字符串 除了匹配,还可以使用正则表达式替换字符串中的内容。例如: ```java String input = "Hello, World!"; String result = input.replaceAll("[A-Za-z]", "*"); System.out.println(result); // 输出 "**,,****!" ``` 上述代码将所有字母替换为星号 `*`[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值