java正则表达式分割字符串_Java开发笔记(三十七)利用正则串分割字符串

前面介绍了处理字符串的常用方法,还有一种分割字符串的场景也很常见,也就是按照某个规则将字符串切割为若干子串。分割规则通常是指定某个分隔符,根据字符串内部的分隔符将字符串进行分割,例如逗号、空格等等都可以作为字符串的分隔符。正好String类型提供了split方法用于切割字符串,只要字符串变量调用split方法,并把分隔符作为输入参数,该方法即可返回分割好的字符串数组。

下面的split调用代码例子演示了如何按照逗号和空格切割字符串:

// 通过逗号分割字符串

private static void splitByComma() {

String commaStr = "123,456,789";

// 利用split方法指定按照逗号切割字符串

String[] commaArray = commaStr.split(",");

for (String item : commaArray) {

System.out.println("comma item = "+item);

}

}

// 通过空格分割字符串

private static void splitBySpace() {

String spaceStr = "123 456 789";

// 利用split方法指定按照空格切割字符串

String[] spaceArray = spaceStr.split(" ");

for (String item : spaceArray) {

System.out.println("space item = "+item);

}

}

除了逗号和空格以外,点号和竖线也常常用来分隔字符串,但是对于点号和竖线,split方法的调用代码不会得到预期的结果。相反,split(".")无法得到分割后的字符串数组,也就是说结果的字符串数组为空;而split("|")分割得到的字符串数组,每个数组元素只有一个字符,其结果类似于toCharArray。究其原因,缘于split方法的输入参数理应是个正则串,并非普通的分隔字符。由于点号和竖线都是正则串的保留字符,因此无法直接在正则串中填写,必须进行转义处理方可。如同回车符和换行符在普通字符串中通过前缀的反斜杆转义那样(回车符对应\r,换行符对应\n),正则字符串通过在原字符前面添加两个反斜杆来转义,像点号字符在正则串中对应的转义符为“\\.”,而竖线在正则串中对应的转义符为“\\|”。经过转移处理之后,通过点号和竖线切割字符串的正确代码写法如下所示:

// 通过点号分割字符串

private static void splitByDot() {

String dotStr = "123.456.789";

// split(".")无法得到分割后的字符串数组

//String[] dotArray = dotStr.split(".");

// 点号是正则串的保留字符,需要进行转义(在点号前面加两个反斜杆)

String[] dotArray = dotStr.split("\\.");

for (String item : dotArray) {

System.out.println("dot item = "+item);

}

}

// 通过竖线分割字符串

private static void splitByLine() {

String lineStr = "123|456|789";

// split("|")分割得到的字符串数组,每个数组元素只有一个字符,类似于toCharArray的结果

//String[] lineArray = lineStr.split("|");

// 竖线是正则串的保留字符,需要进行转义(在竖线前面加两个反斜杆)

String[] lineArray = lineStr.split("\\|");

for (String item : lineArray) {

System.out.println("line item = "+item);

}

}

竖线符号之所以被定为正则串的保留字符,是因为它在正则表达式里起到了“或”的判断作用,例如正则串“,| ”表示逗号和空格都是满足条件的分隔符;一个字符串如果同时包含一个逗号和一个空格,那么按照“,| ”切割的结果将是长度为3的字符串数组;也就是说,原始串被逗号分割一次后又被空格分割一次,这样一共分割两次最终得到了三个子串。下面的代码演示了使用正则串“,| ”切割字符串的效果:

// 利用竖线同时指定多个串来分割字符串

private static void splitByMixture() {

String mixtureStr = "123,456 789";

// 正则串里的竖线表示“或”,竖线左边和右边的字符都可以用来分割字符串

String[] mixtureArray = mixtureStr.split(",| ");

for (String item : mixtureArray) {

System.out.println("mixture item = "+item);

}

}

当然,正则串中的保留字符不仅包括点号和竖线,还包括好些常见的符号,比如加号(+)、星号(*)、横线(-),在正则串中均需进行转义。其中加号的正则转义符为“\\+”,星号的正则转义符为“\\*”,横线的正则转义符为“\\-”。这么估摸下,加减乘除的四则运算符号,只有除法的斜杆符(/)、取余数的百分号(%)无需转义处理。倘若有个字符串,要求以四则运算的五个符号进行切割,则需通过竖线把这几个转义后的字符加以连接,构成形如“\\+|\\*|\\-|/|%”的正则串。于是按照加减乘除符号切割字符串的代码就变为下面这样:

// 通过算术的加减乘除符号来分割字符串

private static void splitByArith() {

String arithStr = "123+456*789-123/456%789";

// 正则串里的加号、星号、横线都要转义,加减乘除符号之间通过竖线隔开

String[] arithArray = arithStr.split("\\+|\\*|\\-|/|%");

for (String item : arithArray) {

System.out.println("arith item = "+item);

}

}

分割用的正则串,不单单是一个个字符,还支持好几个字符组成的字符串。譬如“(1)”、“(2)”、“(3)”都可以作为分隔串,注意圆括号内部的数字可以是0到9,如此一来,从“(0)”到“(9)”的分隔串合集岂不是要写成以下这般:“(0)|(1)|(2)|(3)|(4)|(5)|(6)|(7)|(8)|(9)”?然而以上正则串的写法有两个错误:

1、圆括号也是正则表达式的保留字符,所以不能直接在正则串中书写“(”和“)”,而必须写成转义形式“\\(”和”“\\)”。

2、作为保留字符的圆括号,其作用类似数值计算之时的圆括号,都是通过圆括号把括号内外的运算区分开。而竖线符号“|”的或运算优先级不如圆括号,因此每逢复杂一点的或运算,应当把圆括号放在整个逻辑运算式子的外面。

综合以上两点,修正之后的正则串应该改成下列形式:“\\((0|1|2|3|4|5|6|7|8|9)\\)”。可是该式子的竖线太多,意思仅仅是获取0到9之间的某个数字之一,针对这种情况,正则表达式引入了另外一种简化的写法,即通过方括号包裹0123456789,形如“\\([0123456789]\\)”,同样指代0到9之间的某个数字,从而省略了若干个竖线。进一步说,日常生活中0到9,常常写做“0-9”,于是对应更简单的正则串“\\([0-9]\\)”。

其实0到9正好涵盖了所有的一位数字,对于一位数字而言,正则表达式提供了专门的表达式“\\d{1}”。式子前面的“\\d”代表某个数字,式子后面的“{1}”代表字符数量是1位。推而广之,“\\d{2}”表示两位数字,“\\d{3}”表示三位数字,等等。像这个正则例子只有一位数字,甚至尾巴的“{1}”都可以去掉,因为“\\d”默认就是一位数字。

一口气介绍了许多种从0到9的正则表达串,接下来不妨逐一验证这些正则串是否有效,验证用的代码例子如下所示:

// 通过圆括号及其内部数字来分割字符串

private static void splitByBracket() {

String bracketStr = "(1)123;(2)456;(3)789;";

// 圆括号也是正则串的保留字符,0到9这九个数字使用竖线隔开

//String[] bracketArray = bracketStr.split("\\((0|1|2|3|4|5|6|7|8|9)\\)");

// 利用方括号聚集一群字符,表示这些字符之间是“或”的关系,故而可省略竖线

//String[] bracketArray = bracketStr.split("\\([0123456789]\\)");

// 连续的数字可使用横线连接首尾数字,例如“0-9”表示从0到9之间的所有数字

//String[] bracketArray = bracketStr.split("\\([0-9]\\)");

// 利用“\\d”即可表达0到9的数字,后面的{1}表示1位数字,依此类推{3}表示三位数字

//String[] bracketArray = bracketStr.split("\\(\\d{1}\\)");

// “\\d”默认就是1位数字,此时后面的{1}可直接略去

String[] bracketArray = bracketStr.split("\\(\\d\\)");

for (String item : bracketArray) {

System.out.println("bracket item = "+item);

}

}

上述的几种正则串,只能表达从“(0)”到“(9)”的分隔串,然而圆括号内部还可能是两位数字或者三位数字,比如“(10)”、“(12)”、“(001)”这样。对于数字位数不固定的情况,可以把“\\d”改为“\\d+”,末尾多出来的加号,表示前面的字符允许有一位,也允许有多位。此时正则串添加了加号的字符串切割代码见下:

// 通过特殊符号的加号来分割字符串

private static void splitWithPlus() {

String bracketStr = "(1)123;(2)456;(13)789;";

// 正则串里的加号表示可以有1到多个前面的字符

String[] bracketArray = bracketStr.split("\\(\\d+\\)");

for (String item : bracketArray) {

System.out.println("plus item = "+item);

}

}

上面说的位数不固定,毕竟至少还有一位。假设现在某个字符不但位数不确定,甚至还可能没有该字符(位数为0),采用写法“\\d+”就无法奏效了。要想满足位数可有可无的情况,需将末尾的加号换成星号,也就是改成“\\d*”,此时改用星号的字符串切割代码变为下面这般:

// 通过特殊符号的星号来分割字符串

private static void splitWithStar() {

String bracketStr = "()123;(2)456;(13)789;";

// 正则串里的星号表示可以有0到多个前面的字符

String[] bracketArray = bracketStr.split("\\(\\d*\\)");

for (String item : bracketArray) {

System.out.println("star item = "+item);

}

}

到目前位置,分隔符还仅限于标点和数字,如果引入英文字母作为分隔串,又该如何书写呢?注意英文字母区分大小写,因而使用“a-z”表示所有的小写字母,使用“A-Z”表示所有的大写字母。如果采纳“(a)”、“(B)”、“(c)”这种大小写混合的分隔串,就得通过正则串“\\([a-zA-Z]\\)”来表达,对应的字符串切割代码如下所示:

// 通过大小写字母来分割字符串

private static void splitWithLetter() {

String bracketStr = "(a)123;(B)456;(c)789;";

// 在正则串中表达小写字母和大写字母

String[] bracketArray = bracketStr.split("\\([a-zA-Z]\\)");

for (String item : bracketArray) {

System.out.println("letter item = "+item);

}

}

现在有个麻烦的业务场景,圆括号内部不但可能是数字和字母,还可能是其它标点符号,这下难不成把众多标点符号一个个罗列出来?要知道标点符号可没有“0-9”、“a-z”、“A-Z”的简单写法噢。不过这难不倒强大的正则表达式,因为点号作为正则的保留字符,它代表了除回车\r和换行\n以外的其它字符,所以使用“\\(.\\)”即可表达符合要求的任意字符了,当然是被圆括号包裹着的、除了回车\r和换行\n以外的任意字符。下面便是匹配前述场景的字符串切割代码例子:

// 通过特殊符号的点号来分割字符串

private static void splitWithDot() {

String bracketStr = "(1)123;(B)456;(%)789;";

// 正则串里的点号表示除了回车\r和换行\n以外的其它字符

String[] bracketArray = bracketStr.split("\\(.\\)");

for (String item : bracketArray) {

System.out.println("dot item = "+item);

}

}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.运行环境 本书7~10章所附代码的运行环境 Windows家族,.NET Framework 2.0及以上版本 IIS 5.0及以上版本 本书14~16章所附代码的运行环境 Windows家族,Apache 2.0及以上版本 PHP 5.0及以上版本 本书17~18章所附代码的运行环境 Windows家族,Tomcat JDK6.0 本书19~21章所附代码的调试环境 IE 6.0及以上版本 2.调试环境 本书7~10章所附代码的调试环境 Windows家族,.NET Framework 2.0及以上版本 Visual Studio 2005及以上版本、ASP.NET 2.0及以上版本 本书14~16章所附代码的调试环境 Windows家族,Apache 2.0及以上版本 PHP 5.0及以上版本 本书17~18章所附代码的调试环境 JDK6.0 Eclipse3.2+Lomboz 本书19~21章所附代码的调试环境 IE 6.0及以上版本 文本编辑器 3.本书所附光盘范例 第7章(/07/) DataTypeApplication/Default.aspx 检查和转换数据 第8章(/08/) StringApplication/StringDealwith.aspx 字符串处理 StringBuilderApplication/DealWithStringBuilder.aspx 动态字符串处理 第9章(/09/) RegexApplication/Default.aspx 正则表达式类的应用 RegexApplication/GetPageHtmlData.aspx 获取网页的内容 第10章(/10/) ASPNETValidator/Compare.aspx 比较验证 ASPNETValidator/CompareCheck.aspx 数据类型检查 ASPNETValidator/CompareValue.aspx 值比较验证 ASPNETValidator/CustomClient.aspx 自定义客户端验证 ASPNETValidator/CustomServer.aspx 自定义服务器端验证 ASPNETValidator/NotNull.aspx 非空验证 ASPNETValidator/NotNullInitValue.aspx 不等于初始化值的验证 ASPNETValidator/RangeDate.aspx 日期范围验证 ASPNETValidator/RangeInt.aspx 整数范围验证 ASPNETValidator/RangeLetter.aspx 字母范围验证 ASPNETValidator/REDate.aspx 日期格式验证 ASPNETValidator/REEmail.aspx 电子邮件格式验证 ASPNETValidator/REIdentity.aspx 身份证号码格式验证 ASPNETValidator/REInt.aspx 整数格式验证 ASPNETValidator/RENumber.aspx 数值格式验证 ASPNETValidator/REPhone.aspx 电话号码格式验证 ASPNETValidator/REUrl.aspx URL地址格式验证 ASPNETValidator/SummaryDialog.aspx 对话框式验证摘要 ASPNETValidator/SummaryPage.aspx 网页式验证摘要 第11章(/11/) 判断是否为对象.asp 判断是否为对象 判断是否为数值.asp 判断是否为数值 判断是否为数组.asp 判断是否为数组 判断是否为日期.asp 判断是否为日期 判断是否为空.asp 判断是否为空 判断是否为空值.asp 判断是否为空值 获取变量类型信息.asp 获取变量类型信息 第12章(/11/) 从中截取字符串.asp 从中截取字符串 切分字符串.asp 切分字符串 删除字符串前后导空格.asp 删除字符串前导空格.asp 删除字符串后导空格.asp 反向截取字符串.asp 反向查找字符串.asp 字符串倒序排列.asp 字符串大写转化.asp 字符串小写转化.asp 字符串替换.asp 将数组元素连接为字符串.asp 构造制定字符串.asp 正向截取字符串.asp 正向查找字符串.asp 获取字符串长度.asp 第13章(/14/) Matches集合与Macth对象.asp 指定忽略大小写.asp 获取Matches集合.asp 进行正则匹配替换.asp 进行正则匹配检验.asp 第14章(/14/) 浮点型数据测试.php 浮点型数据测试 字符串数据测试.php 字符串数据测试 数组数据测试.php 数组数据测试 对象测试.php 对象测试 数据类型识别.php 数据类型识别 强制类型转化.php 强制类型转化 计算圆周面积程序.php 计算圆周面积程序 字符串转化.php 字符串转化 数值转化.php 数值转化 数组转化.php 数组转化 第15章(/15/) 计算字符串的长度.php 计算字符串的长度 访问单个字符.php 访问单个字符 检索字符的位置.php 检索字符的位置 截取子字符.php 截取子字符 查找字符串出现的次数.php 查找字符串出现的次数 替换子字符串.php 替换子字符串 按照特定字符进行分割.php 按照特定字符进行分割 按照指定数目进行分割.php 按照指定数目进行分割 删除字符串的空白.php 删除字符串的空白 字符串的填补.php 字符串的填补 字符串大小写的转换.php 字符串大小写的转换 字符串的反转.php 字符串的反转 字符串按ASCII码顺序比较.php 字符串按ASCII码顺序比较 字符串按“自然排序”法比较.php 字符串按“自然排序”法比较 根据单词的发音比较.php 根据单词的发音比较 根据单词的相似性比较.php 根据单词的相似性比较 查找子字符串.php 查找子字符串 搜寻出现的字符.php 搜寻出现的字符 字符匹配.php 字符匹配 字符替换.php 字符替换 字符串翻译.php 字符串翻译 格式化数字.php 格式化数字 格式化表单字符串.php 格式化表单字符串 24.php 格式化字符串 25.php 格式化HTML实体 26.php HTML标签的清理 解析URL字符串.php 解析URL字符串 解析查询字符串.php 解析查询字符串 URL编码处理.php URL编码处理 查询字符串的构造.php 查询字符串的构造 第16章(/16/) 字符串模式匹配.php 字符串模式匹配 字符串大小模式匹配.php 字符串大小模式匹配 日期字符串模式匹配.php 日期字符串模式匹配 模式替换.php 模式替换 模式分割.php 模式分割 正则表达式匹配.php 正则表达式匹配 其他的正则表达式匹配.php 其他的正则表达式匹配 取得正则表达式的全部匹配.php 取得正则表达式的全部匹配 返回与模式匹配的数组单元.php 返回与模式匹配的数组单元 正则表达式的替换.php 正则表达式的替换 正则表达式的拆分.php 正则表达式的拆分 表单验证.php 表单验证 UBBCode.php UBB代码 ubb.html UBB代码输入界面 ubb.php UBB代码输出界面 Apache日志分析.php Apache日志分析 第17章(/17/) JSPExample1.jsp JSP页面中整型数据的使用 JSPExample2.jsp JSP页面中循环输出整型数据 JSPExample3.jsp 计算一光年的距离 JSPExample4.jsp JSP页面中计算圆的面积 JSPExample5.jsp JSP页面中字符数据的简单使用 JSPExample6.jsp 结合布尔类型变量判断学生成绩等级 JSPExample7.jsp text.html页面提交至该页,并显示提交数据 text.html 页面数据提交至JSPExample7.jsp JSPExample8.jsp 不同类型混合运算自动转换 JSPExample9.jsp 不同类型混合运算强制转换 JSPExample10.jsp 字符串类型与其他数据类型的转换 JSPExample11.jsp 解析字符串的子字符串 stringOP.html 页面数据提交至JSPExample12.jsp JSPExample12.jsp 字符串替换 JSPExample13.jsp 字符串大小写转换、反转等操作 logon.html 页面数据提交至JSPExample14.jsp JSPExample14.jsp 字符串数据的比较 JSPExample15.jsp 字符串数据的连接 JSPExample16.jsp 字符串数据的格式化 第18章(/18/) 1.jsp Pattern对象使用split方法示例一 2.jsp Pattern对象使用split方法示例二 3.jsp Matcher对象使用appendReplacement方法示例 4.jsp Matcher对象使用groupCount方法示例 5.jsp Matcher对象使用find方法示例 6.jsp Matcher对象使用group方法示例 7.jsp 字符串对象使用split方法 8.jsp Matcher对象使用replaceAll方法示例 9.html 页面数据提交至9.jsp 9.jsp 利用正则表达式验证邮箱地址 10.html 页面数据提交至10.jsp 10.jsp 利用正则表达式验证URL地址 11.html 页面数据提交至11.jsp 11.jsp 利用正则表达式验证电话号码 第20章(/20/) 从字符串中提取子(1).html 从字符串中提取子(1) 从字符串中提取子(2).html 从字符串中提取子(2) 从字符串中提取子(3).html 从字符串中提取子(3) 删除或替换数组中部分数据.html 删除或替换数组中部分数据 删除数组中最后一个元素.html 删除数组中最后一个元素 删除数组中的第一个元素.html 删除数组中的第一个元素 反序排列数组中的元素.html 反序排列数组中的元素 在字符串上加入超级链接.html 在字符串上加入超级链接 在字符串两端加上小字体标记.html 在字符串两端加上小字体标记 在字符串两端加入上标标签.html 在字符串两端加入上标标签 在字符串两端加入下标标签.html 在字符串两端加入下标标签 在字符串两端加入斜体标签.html 在字符串两端加入斜体标签 在字符串两端加入锚点标志.html 在字符串两端加入锚点标志 在字符串的两端加上固定宽度字体标记.html 在字符串的两端加上固定宽度字体标记 在字符串的两端加上粗体标志.html 在字符串的两端加上粗体标志 在字符串的两端加入下划线标记.html 在字符串的两端加入下划线标记 在指定字符串的两端加上大字体标志.html 在指定字符串的两端加上大字体标志 在数组前面插入数据.html 在数组前面插入数据 对数组中的元素进行排序.html 对数组中的元素进行排序 将一个或多个字符串连接到当前字符串的末尾.html 将一个或多个字符串连接到当前字符串的末尾 将字符串分割并存储到数组中.html 将字符串分割并存储到数组中 将字符串转化为大写格式.html 将字符串转化为大写格式 将字符串转化为小写格式.html 将字符串转化为小写格式 将指定的数据添加到数组中.html 将指定的数据添加到数组中 将数组元素连接为字符串.html 将数组元素连接为字符串 替换字符串中指定的内容.html 替换字符串中指定的内容 根据指定的Unicode编码返回一个字符串.html 根据指定的Unicode编码返回一个字符串 比较两个字符串的大小.html 比较两个字符串的大小 获取字符串的长度.html 获取字符串的长度 获取指定位置的字符的Unicode编码.html 获取指定位置的字符的Unicode编码 获取指定字符()第一次在字符串中出现的位置.html 获取指定字符()第一次在字符串中出现的位置 获取数组中的一部分数据.html 获取数组中的一部分数据 设置字符串输出时的前景色.html 设置字符串输出时的前景色 设置字符串输出时的字体大小.html 设置字符串输出时的字体大小 返回一个包含数组中全部数据的字符串.html 返回一个包含数组中全部数据的字符串 返回字符串中指定位置处的字符.html 返回字符串中指定位置处的字符 连接其他数组到当前数组末尾.html 连接其他数组到当前数组末尾 第21章(/21/) 判断字符串中是否存在匹配内容.html 判断字符串中是否存在匹配内容 对字符串进行匹配检测.html 对字符串进行匹配检测 替换字符串中的指定内容.html 替换字符串中的指定内容 编译正则表达式.html 编译正则表达式 获取与正则表达式进行匹配检测的字符串.html 获取与正则表达式进行匹配检测的字符串 获取匹配内容右侧的字符信息.html 获取匹配内容右侧的字符信息 获取匹配内容左侧的字符信息.html 获取匹配内容左侧的字符信息 获取匹配的内容的最后一个索引位置.html 获取匹配的内容的最后一个索引位置 获取子匹配的结果.html 获取子匹配的结果 获取字符串中所有的匹配信息.html 获取字符串中所有的匹配信息 获取最近一次匹配的内容.html 获取最近一次匹配的内容 获取最近一次匹配的最后一个子匹配.html 获取最近一次匹配的最后一个子匹配 获取第一次匹配的起始位置(1).html 获取第一次匹配的起始位置(1) 获取第一次匹配的起始位置(2).html 获取第一次匹配的起始位置(2)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值