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

目录

字符串的连接

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

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;    /* 通过两个条件表示文件名合法 */elseSystem.out.println ( "文件名无效.." );if ( (email.indexOf('@') != -1) &&    /* @ 元素的下标不为 -1 表示 @ 存在 */( email.indexOf('.') > email.indexOf('@') ) )    /* . 元素必须处于 @ 元素后面 */emailName = true;    /* 通过两个条件表示邮箱名合法 */elseSystem.out.println ( "E-mail 无效.." );if ( fileName && emailName )    /* 提交条件 文件名、邮箱名 皆合法 */System.out.println ( "... 作业提交成功!" );elseSystem.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>>> 注册成功!";} elsereturn "\n\t>>> 座机号码区必须是 4 位且电话号码必须为 7 位!\n";}
}

9.1_[Java 字符串]-复杂的字符串处理相关推荐

  1. Java案例——统计字符串中每个字符串出现的次数

    统计字符串中每个字符串出现的次数 需求: 1.键盘录入一个字符串,要求统计字符串中每个字符串出现的次数 举例:键盘录入"aababcabcdabcde" 在控制台输出:" ...

  2. Java计算两个字符串日期之间的天数差

    Java计算两个字符串日期之间的天数差 调用方法: public static void main(String[] args) throws ParseException {String a = & ...

  3. java代码中fastjson生成字符串和解析字符串的方法和javascript文件中字符串和json数组之间的转换方法...

    1.java代码中fastjson生成字符串和解析字符串的方法 List<TemplateFull> templateFulls = new ArrayList<TemplateFu ...

  4. Java:判断一个字符串中是否存在另一个字符子串以及判断一个字符串中是否存在指定字符

    Java:判断一个字符串中包含指定字符子串,判断一个字符串中存在指定字符 字符串的contains方法可以判断一个字符串中是否存在另一个字符子串,示例如下 String Str = "Hel ...

  5. java判断回文字符串几种简单的实现

    11年it研发经验,从一个会计转行为算法工程师,学过C#,c++,java,android,php,go,js,python,CNN神经网络,四千多篇博文,三千多篇原创,只为与你分享,共同成长,一起进 ...

  6. java双等号比较字符串,Java与两个字符串==比较是错误的?

    ==运算符比较对象引用,而不是String的值. 要比较String的值,请使用String.equals方法: "231".equals(parts[0]); Java中的任何其 ...

  7. 【Android NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 )

    文章目录 I . C/C++ 中的 Java 字符串数组类型 II . 获取字符串数组长度 III . 获取字符串数组元素 IV . 类型强转 ( jobject -> jstring ) V ...

  8. 第19天学习Java的笔记-String字符串

    29天! 字符串 1.字符串概述和特点.构造方法和直接创建 package Demo1901;/* * java.lang.String类代表字符串. * API当中说,Java程序中的所有字符串字面 ...

  9. java 补0_Java String字符串补0或空格

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. package cn.com.songjy; import java.text.Numbe ...

最新文章

  1. 2020年国际学术会议参考列表
  2. SCCM 2007系列4 播发操作系统上
  3. php 过滤特殊字符和sql防注入代码以及xss攻击等
  4. linux查文件名称唯美,第二章、Linux常用命令
  5. VMwareTool 安装
  6. SageMath安装及使用
  7. Mr.J-- jQuery学习笔记(二)--核心函数jQuery对象
  8. IBM Copy Service--Flashcopy Introduction
  9. Python基础——numpy.ndarray一维数组与多维数组
  10. React 之 JSX
  11. security java的配置_springSecurity之java配置篇
  12. axis2弱密码漏洞复现
  13. ubuntu1604 golang环境
  14. 1.9 LaTex边注与脚注
  15. 随机数生成器python
  16. ZYNQ芯片软硬件协同开发二:最简Linux操作系统的硬件部分设计
  17. 第五人格显示服务器维护中请稍后登录怎么办,第五人格账号登录失败怎么办
  18. python pandas dataframe 不显示索引_Python DataFrame 设置输出不显示index(索引)值的方法...
  19. React Native学习资源汇总
  20. 关于Field Exit 整理的一点资料

热门文章

  1. 58欧氏空间05——实对称矩阵的正交相似对角化
  2. 超简单螺旋矩阵详细注释版(c语言)
  3. kubectl常见命令及错误排除
  4. 超实用!精选34个Python自动化库!
  5. ios通过app读取通讯录信息
  6. 来来来,看看有没有适合你的物联网操作系统
  7. 如何手动绘制对数坐标轴_用Excel绘制标准曲线(画半对数坐标)
  8. 搭建人工智能wx机器人完整版教程
  9. GoSurf真是奇怪啊。
  10. EasyConnect找不到小图标,原来是换成浮窗了