9.1_[Java 字符串]-复杂的字符串处理

##################################################

目录

字符串的连接

加号运算符用来拼接字符串

concat() 方法连接两个字符串

字符串的提取和查询及去除空格方法

字符串的索引概念

查询方法使用 indexOf() 首个搜索或 lastIndexOf() 末个搜索

substring() 提取方法

去除空格 trim 方法

经典邮箱验证程序示例

字符串的 split() 拆分方法

split()

语法

示例拆分按行输出

整合项目训练 —— 会员帐号信息注册

需求

思路

代码和测试


##################################################

字符串的连接

————————————

加号运算符用来拼接字符串

%%%%%

        我们很早以前就学到

+

        运算符就起到了连接字符串的作用

        并且我们在 return 语句后面也可以使用加号来连接字符串

        我们还知道两个字符串变量之间也可以用加号运算符连接拼凑成一个新的字符串

        现在我们学一种新的方法 就是在定义一个字符串的时候 也可以连接字符串!

        语法格式:

String 变量名 = "值_1" + "值_2" + " + "值_N";

%%%%%

示例程序

        输出每个学生的成绩信息

        code:

/*    CentOS 7 Demo:
[lilian@CentOS javaTest]$ javac Main.java
[lilian@CentOS javaTest]$ java Main
***学生成绩***
	李恰恰 >>> 100
	李二哈 >>> 200
	老姐姐 >>> 300
[lilian@CentOS javaTest]$ 
 */

class Main {

	public static void main(String[] args) {

		int a = 100, b = 200, c = 300;

		String d = "\t李恰恰 >>> " + a
			+ "\n\t李二哈 >>> " + b
			+ "\n\t老姐姐 >>> " + c;

		System.out.println ( "***学生成绩***\n" + d );
	}
}

        我们上面定义声明字符串时
        使用加运算符将任意多个字符串连接在一起

        然后发现使用加运算符将

String类型

        和

int类型

        的变量连接

        这说明字符串和整形也可以连接

        由此可以推断出 int/double/char 型
        使用加运算符连接时都会通过加运算符自动转换成 String 类型

        示例连接输出四大类型:

/*    CentOs 7 Demo:
[lilian@CentOS javaTest]$ javac Main.java
[lilian@CentOS javaTest]$ java Main
5211314	3.1415926	A	哟哟切哥闹,煎饼果子来一套!
[lilian@CentOS javaTest]$ 
 */

class Main {

	public static void main(String[] args) {

		int a = 5211314;
		double b = 3.1415926;
		char c = 'A';
		String d = "哟哟切哥闹,煎饼果子来一套!";

		System.out.println ( a + "\t"
					+ b + "\t"
					+ c + "\t"
					+ d );
	}
}

——————————

concat() 方法连接两个字符串

%%%%%

        Java 的 String 类还提供了另一个方法 concat() 方法
        作用是将一个字符串连接到另一个字符串的后面
        然后返回一个新的字符串

%%%%%

        语法格式:

字符串.concat(字符串);

%%%%%

        示例连接输出:

世界,你好!

        code && demo:

/*    CentOS 7 Demo:
[lilian@CentOS javaTest]$ java Main
世界,你好!
[lilian@CentOS javaTest]$ 
 */

class Main {

	public static void main(String[] args) {

		String a = new String ( "世界," );
		String b = new String ( "你好!" );
		String c = a.concat ( b );

		System.out.println ( c );
	}
}

%%%%%

        好 最后我们总结一下

        连接字符串的方法有两种:

+ 运算符
concat 方法

##################################################

字符串的提取和查询及去除空格方法

——————————

        我们经常会用到对字符串的某一部分进行查询和提取的问题

        下面列出 String 类提供的一些常用的 提取 和 查询 方法
        然后挨个讲解用法和小知识点

%%%%%

字符串的索引概念

        我们说过 字符串是一个字符序列 每一个字符都有自己的位置

        字符串事实上也是一个字符数组!
        因此 她的位置从 0 开始到 字符串长度 - 1 结束!

        也就是说 跟数组一样 从 0 开始:

0 1 2 3 4 5 N

        跟数组的下标一样 这个叫字符串中的字符索引

%%%%%

查询方法使用 indexOf() 首个搜索或 lastIndexOf() 末个搜索

        执行搜索操作有两种方法

        搜索第一个出现的 字符 ch 或字符串 value

public int indexOf(字符)
public int indexOf(字符串)

        搜索最后一个出现的 字符 ch 字符串 value:

public int lastIndexOf(ch)
public int lastIndexOf(value)

        indexOf() 在字符串内搜索某个指定的 字符/字符串
        会返回出现第一个匹配字符的位置
        如果没有找到匹配 会返回 -1

        操作方法是在括号中写明要搜索的 字符/字符串 的名字

        假如:

String str = "兽人永不为奴!";

        我们要搜索 '不' 这个字符的位置:

int index = str.indexOf('不');

        最后返回的值为 3
        为什么?明明从左边数是第 4 个?!
        别忘了 从 0 开始下标索引计数!

        lastIndexOf 方法也是在字符串内搜索某个指定的 字符/字符串
        但是她是搜索最后一个出现的 字符/字符串 首字符位置

        假如 我们的

String str = "兽人永不为奴啊兽人永不为奴";

        我们要搜索 str 中最后出现的字符串 "兽人" 的首字符位置:

int index = str.lastIndexOf("兽人");

        最后的返回值为 7

%%%%%

substring() 提取方法

        用于提取字符或字符串

        提取从位置索引往后开始计算的字符串部分:

public String substring(开始位置)

        提取 beginindex/开始下标 和 endindex/结束下标 之间的字符串部分:

public String substring(int beginindex, int endindex)

        substring(int index) 这个方法用于提取从索引位置开始的 包括此位置的字符 的字符串部分
        调用时 括号中可以写要提取的字符串的开始位置
        方法的返回值就是要提取的字符串

        假如 我们的

String str = "兽人永不为奴啊兽人永不为奴";

        提取字符串 str 中的 "啊兽人永不为奴" :

String str_1 = str.substring(6);

        substring(int beginIndex, int endIndex) 就是提取开始位置 beginIndex 到结束位置 endIndex 之间的字符串部分

        我们需要注意的是
        对于开始位置 是基于字符串的首字符为 0 来进行处理的
        就是说 我们还是从 0 开始数
        but 离谱的是对于结束位置 却是基于字符串的首字符为 1 来进行处理的!!!
        就是说 结束为止我们应该从 1 开始数起……这真是,,绝绝子!

        这么看能不能看懂 上面是开始下标 下面是结束下标 中间是字符串元素:

0	1	2	3	4	5	6	7	8	9	10	11	12    /* 开始索引 */
兽	人	永	不	为	奴	啊	兽	人	永	不	为	奴    /* 字符数组/字符串 元素 */
1	2	3	4	5	6	7	8	9	10	11	12	13    /* 结束索引 */

        当然 你也可以这样记 不是很推荐这么记 毕竟 小技巧终究是上不了台面的 不是吗:
        若开始下标为 0 :

开始位置 0
结束位置 N - 1

        若开始下标为 1 :

开始位置 1
结束位置 N + 1

        这种鬼才思维能不能理解?
        只要能达到目的 过程再鬼畜都不重要!你永远不知道你的同事是用什么奇葩方式完成的功能!!

        我们的:

String str = "兽人永不为奴啊兽人永不为奴";

        提取 str 中的 "奴啊兽" 这段字符串:

String str_1 = str.substring(5, 8);

%%%%%

去除空格 trim 方法

        返回一个前后不含任何空格的调用字符串的副本

        这是方法原型:

public String trim()

        这个方法可以忽略字符串前后的空格

        可能你会奇怪为什么要这样?
        有时候 客户的注册信息可能会包含空格
        这个时候就要在接收用户输入的字符串时调用此方法过滤字符串前后多余空格

%%%%%

经典邮箱验证程序示例

        例如我们下面这个需求:

使用作业提交系统提交 Java 作业时
输入 Java 源代码文件名
并输入自己的邮箱
提交前系统会检查是否是合法的文件名
还会检查邮箱是否为合法邮箱
我们需要完成这个提交验证功能

        那我们该怎么办呢?

        判断提交的 Java 文件是否合法 这个简单
        只需要判断后缀名是不是以

.java

        结尾的即可

        判断邮箱是否合法 至少要检查邮箱名中是否包含字符

@

        然后这个 @ 字符是否在字符之前
        要完成这种功能 就需要使用 String 类中的 提取 和 搜索 字符串方法

        话说邮箱知道吧。。?! 这个要是不知道。。无语!
        就拿扣扣邮箱来说吧:

XXXXXXXXXX@qq.com 

        我们可以根据不同的 提取 和 搜索 字符串的方法搭配组合使用

        Main.java code:

/*    CentOS 7 Demo:
[lilian@CentOS javaTest]$ javac Main.java
[lilian@CentOS javaTest]$ java Main
*** Java 作业提交程序 ***
请输入 Java 文件名 <<< 123.Java
请输入邮箱 <<< csdnranchui@qq.com
文件名无效..
... 作业提交失败!
[lilian@CentOS javaTest]$ java Main
*** Java 作业提交程序 ***
请输入 Java 文件名 <<< 123.java
请输入邮箱 <<< csdnranchui@qqcom
E-mail 无效..
... 作业提交失败!
[lilian@CentOS javaTest]$ java Main
*** Java 作业提交程序 ***
请输入 Java 文件名 <<< 123.java
请输入邮箱 <<< csdnranchui@qq.com
... 作业提交成功!
[lilian@CentOS javaTest]$ 
 */

import java.util.Scanner;

class Main {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		boolean fileName = false, emailName = false;    /* 文件名标识, 邮箱名标识 */

		System.out.println ( "*** Java 作业提交程序 ***" );
		System.out.print ( "请输入 Java 文件名 <<< " );
		String file = sc.next();    /* 得到文件名 */
		System.out.print ( "请输入邮箱 <<< " );
		String email = sc.next();    /* 得到邮箱名 */

		int index = file.lastIndexOf(".");    /* 得到文件名的 . 的下标位置 */
		if ( (index != -1) && (index != 0) &&    /* . 元素的下标不为 -1 表示 . 存在 不为 0 表示不在首位 */
			( file.substring( index+1, file.length() ).equals( "java" ) ) )    /* 截取比较从 下标 + 1 到 字符串结尾 的内容是不是 java 文件后缀名 */
			fileName = true;    /* 通过两个条件表示文件名合法 */
		else
			System.out.println ( "文件名无效.." );

		if ( (email.indexOf('@') != -1) &&    /* @ 元素的下标不为 -1 表示 @ 存在 */
			( email.indexOf('.') > email.indexOf('@') ) )    /* . 元素必须处于 @ 元素后面 */
			emailName = true;    /* 通过两个条件表示邮箱名合法 */
		else
			System.out.println ( "E-mail 无效.." );

		if ( fileName && emailName )    /* 提交条件 文件名、邮箱名 皆合法 */
			System.out.println ( "... 作业提交成功!" );
		else
			System.out.println ( "... 作业提交失败!" );
	}
}

        判断文件名是否合法的时候 用了三个限制条件:

index != -1
index != 0
file.substring ( index+1, file.length() ).equals( "java" )

        前两个条件用来判断 字符串中包含点号并且点号不在首位
        后面的条件表示 先得到 substring 处理后的字符串 然后判断是否是 java

        判断邮箱名时 用了两个限制条件:

email.indexOf( '@' ) != -1
email.indexOf( '.' ) > email.indexOf( '@' )

        第一个条件表示是否包含 @ 字符
        第二个条件表示 是否包含 . 字符 并且 @ 字符处于 . 字符的前面

        可见 要想在程序中处理好字符串 就要将这些方法巧妙地结合起来 灵活运用!

##################################################

字符串的 split() 拆分方法

——————————

split()

        还有一种情况 就是字符串的拆分! 实际应用中 我们经常用到的

        Java 的 String 类提供了一个拆分字符串的方法 split()

将子一个字符串分割为子字符串 结果作为字符串数组返回!

——————————

语法

        语法格式:

字符串.split ( String separator, int limit );

        括号中的 separator 可选项/参数 标识拆分字符串时使用一个或多个字符
        如果不选择该项 则返回该字符串所有单个字符的元素数组

        第二个 limit 可选项/参数 用来限制返回数组中的元素个数

——————————

示例拆分按行输出


        需求:

有一段歌词
每一句都以空格结尾
请将歌词的每句按行输出

        demo && code:

/*    CentOS 7 Demo:
[lilian@CentOS javaTest]$ javac Main.java
[lilian@CentOS javaTest]$ java Main
***原歌词格式***
如果让你重新来过 你会不会爱我 爱情让人拥有快乐 也会带来折磨 曾经和你一起走过传说中的爱河 已经被我泪水淹没 变成痛苦的爱河~ 

***拆分后格式***
如果让你重新来过
你会不会爱我
爱情让人拥有快乐
也会带来折磨
曾经和你一起走过传说中的爱河
已经被我泪水淹没
变成痛苦的爱河~
[lilian@CentOS javaTest]$ 
 */

class Main {

	public static void main(String[] args) {

		String words = "如果让你重新来过 你会不会爱我 爱情让人拥有快乐 也会带来折磨 "
			+ "曾经和你一起走过传说中的爱河 已经被我泪水淹没 变成痛苦的爱河~ ";

		System.out.print ( "***原歌词格式***\n" + words );

		String printWord[] = new String[1000];    /* 声明储存数组内容 1000 个字符串 */
		printWord = words.split(" ");    /* 按照空格拆分 */

		System.out.print ( "\n\n***拆分后格式***\n" );
		for ( int i = 0; i < printWord.length; i ++ )
			System.out.println ( printWord[i] );
	}
}

        如果我们使用控制台输入技术来完成 那么一定不能使用 next() 而是用 nextLine()

/*    CentOs 7 Demo:
[lilian@CentOS javaTest]$ javac Main.java
[lilian@CentOS javaTest]$ java Main
请输入一段歌词 <<< 如果让你重新来过 你会不会爱我 爱情让人拥有快乐 也会带来折磨曾经和你一起走过传说中的爱河 已经被我泪水淹没 变成痛苦的爱河~
***原歌词格式***
如果让你重新来过 你会不会爱我 爱情让人拥有快乐 也会带来折磨曾经和你一起走过传说中的爱河 已经被我泪水淹没 变成痛苦的爱河~

***拆分后格式***
如果让你重新来过
你会不会爱我
爱情让人拥有快乐
也会带来折磨曾经和你一起走过传说中的爱河
已经被我泪水淹没
变成痛苦的爱河~
[lilian@CentOS javaTest]$ 
 */

import java.util.Scanner;

class Main {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		System.out.print ( "请输入一段歌词 <<< " );
		String words = sc.nextLine();
		System.out.print ( "***原歌词格式***\n" + words );

		String printWord[] = new String[1000];
		printWord = words.split( " " );

		System.out.print ( "\n\n***拆分后格式***\n" );
		for ( int i = 0; i < printWord.length; i ++ )
			System.out.println ( printWord[i] );
	}
}

        String 类操作字符串的方法很多
        除了这些常见方法 还有很多有趣的方法 很多在实际开发中可能用到的方法这个文件没有讲到
        可以通过查看 Java API 帮助文档来深入了解

        最好是自己汇总 加深记忆/理解 方便以后自己查找

##################################################

整合项目训练 —— 会员帐号信息注册

——————————

需求

        实现会员帐号信息注册

为了方便将抽奖结果及时反馈给客户
商场注册时 要求会员提供身份证号和电话
身份证号必须是 15 位或 18 位
手机必须是 11 位
座机必须以字符 - 连接 - 前面必须是 4 位数 - 后面必须是 7 位数
通过验证即可注册成功
如果验证不通过 便进行相应异常处理

——————————

思路

        前面的都好说 主要是最后一个
        我们有两种方式判断

第一种最方便的
是按照字符 - 来拆分成字符串数组
然后判断长度对比即可

我们这里使用第二种比较绕的方法

因为第一种方法比较简单 我们挑战第二种
判断有木有 - 字符
判断 - 字符必须是第 5 个字符 下标为 4
- 字符前面有 4 个字符 后面有 7 个字符

        不过你必须用第二种 我这里只是展示了一种方法 你必须挑战自己!

——————————

代码和测试

        code && demo:

/*    CentOS 7 Demo:
[lilian@CentOS javaTest]$ javac Main.java
[lilian@CentOS javaTest]$ java Main
***注册会员帐号 第[1]次***
请输入身份证 <<< 111
请输入手机号 <<< 111
请输入座机号 <<< 111

	>>> 身份证号必须是 15 位或 18 位!

***注册会员帐号 第[2]次***
请输入身份证 <<< 111111111111111111
请输入手机号 <<< 111
请输入座机号 <<< 111

	>>> 手机号必须是 11 位!

***注册会员帐号 第[3]次***
请输入身份证 <<< 111111111111111111
请输入手机号 <<< 11111111111
请输入座机号 <<< 111

	>>> 座机号码区必须是 4 位且电话号码必须为 7 位!

***注册会员帐号 第[4]次***
请输入身份证 <<< 111111111111111111
请输入手机号 <<< 11111111111
请输入座机号 <<< 11-111

	>>> 座机号码区必须是 4 位且电话号码必须为 7 位!

***注册会员帐号 第[5]次***
请输入身份证 <<< 111111111111111111
请输入手机号 <<< 11111111111
请输入座机号 <<< 1111-1111111

	>>> 注册成功!
[lilian@CentOS javaTest]$ 
 */

import java.util.Scanner;

class Main {

	public static void main(String[] args) {

		for ( int count = 1; ; count ++ ) {

			Scanner sc = new Scanner(System.in);

			/* 获取输入信息 */
			System.out.println("***注册会员帐号 第["+ count + "]次***" );
			System.out.print ( "请输入身份证 <<< " );
			String a = sc.next();
			System.out.print ( "请输入手机号 <<< " );
			String b = sc.next();
			System.out.print ( "请输入座机号 <<< " );
			String c = sc.next();

			/* 存储输入信息 */
			Information infor = new Information();    /* 实例化信息类信息对象 */
			String d = infor.abnormal ( a, b, c );    /* 测试输入是否合法 */
			System.out.println ( d );    /* 输出回显信息 */
			if ( d.indexOf( "注册成功" ) != -1 )    /* 如果搜索到 "注册成功" 就结束程序 */
				break;
			else    /* 如果返回一个非正数表示没有搜索到 让用户重新输入 */
				continue;
		}
	}
}

class Information {
/* 信息类 */

	String userIn[] = new String[3];    /* 字符串数组 三个字符串空间 */

	public void register ( String a, String b, String c ) {
    /* 接收并存储三个字符串 */

		userIn[0] = a;
		userIn[1] = b;
		userIn[2] = c;
	}

	public String abnormal ( String a, String b, String c ) {

		if ( (a.length() != 15) && (a.length() != 18) )
		/* 条件 身份证号为 15 或 18 位 */
			return "\n\t>>> 身份证号必须是 15 位或 18 位!\n";
		if ( b.length() != 11 )
		/* 条件 手机号为 11 位 */
			return "\n\t>>> 手机号必须是 11 位!\n";
		if ( (c.indexOf('-') == 4 ) &&
			( ( c.substring( c.indexOf('-') + 1, c.length() ) ).length() == 7) )
		{ /* 条件 - 必须为第 5 位表示前面有 4 位 然后提取 - 后第 6 位到长度最后一位的内容 这部分内容位数必须为 7 位 */
			register(a, b, c);
			return "\n\t>>> 注册成功!";
		} else
			return "\n\t>>> 座机号码区必须是 4 位且电话号码必须为 7 位!\n";
	}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燃吹

呜呜呜没钱钱吃饭了……

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值