1.JavaSE5推出了C语言printf风格的格式化输出这一功能。这不仅使得控制输出的代码更加简单,而且也给与Java开发者对于输出格式与排列的更强大的控制能力。

2.C语言printf,占位符-如:printf("Row1:  [%d %f] \n",x,y);占位符-格式修饰符,不但说明了插入数据的位置,还说明了插入变量的类型以及如何格式化,这个%d表示x是一个整数,%表示y是一个浮点数(double或者float)

3.System.out.format:

如果你怀旧的话的,也可以使用System.out.printf.JavaSE5引入的format方法可以用于PrintStream和PrintWriter对象。其中也包括System.out对象。format方法模仿C的printf.

4.Formatter类:

在Java中,所有新的格式化功能都由java.util.Formatter类处理。你可以将一个Formatter看做一个翻译器,它将你的格式字符串与数据翻译成所需要的结果。当你创建一个Formatter对象的时候,需要向其构造器传递一些信息,告诉它最终的结果将向那里输出,如new Formatter(System.out);

Formatter的构造器可以经过重载,接受多种输出目的地。不过最常用的还是PrintStream,OutputStream和File

5.格式化说明符:

1.控制空格与对齐:

%[argument_index$][flags][width][.precision]conversion

例:f.format("%-15s %5d %10.2f  \n")

width:控制一个域的最小尺寸,指定width实现。Formatter对象通过在必要时添加空格来表示确保一个域至少达到某个长度。默认的情况下,数据是右对齐。不过可以通过改变argument_index,如-,来改变对齐方向。

precision:精度,指明最大尺寸。不是所有的数据类型都可以使用precision.而且应用于不同的数据类型转换时,precision的意义也不同。用于String:表示打印String输出字符的最大数量;应用浮点数:其表示小数部分要显示出来的位数,默认是6位,如果小数位数过多则舍入,太少则在尾部补0.由于整数没有小数部分,所以无法应用precision.如果对整数应用,则会触发异常。

6.Formatter类型转换:

1.d 整数型,10进制,Decimal   2.c unicode字符  3.b boolean值  4.s String   5.f 浮点数(10进制)  6.e 浮点数(科学计数)  7.x 整数 16进制 hex 8.h 散列码(16进制) hash 9.% %  10.o 八进制整数 octal

2.对于boolean类型或者Boolean对象,其转换结果永远是true或者false.但是,对于其他类型的对象,只要改参数不为null,其永远为true.即使是数字0,转换结果依然为true。这在其他语言包括C,往往为false.所以将b应用于非boolean类型的对象时候要格外小心.

7.String.format:

JavaSE5也参考了c的printf方法,以生成格式化的String对象。String.format是一个String对象,其接受与Formatter.format一样的参数 ,但返回一个String对象。当只需要使用format方法一次的时候,String.format用起来很方便。

其实在String.format内部,也是创建了一个StringFormatter对象,然后将传入的参数传递给StringFormatter,不过与其自己做这些事情,还不如使用便捷的String.format方法,何况这样的代码更加清晰易读。

8.16进制转储工具:

1.在处理2进制文件时,我们经常希望以16进制的格式看内容。所以可以做一个工具,利用String.format,以可读的16进制格式将字节数组打印出来。

9.正则表达式

1.很久以前,正则表达式就已经整合到标准Unix的工具集之中,如sed和awk,以及程序设计语言,如python和perl.Java中字符串操作还主要集中在String,StringBuffer,StringTokenizer。正则表达式是一种强大而灵活的文本处理工具。

2.基础

1.一般来说,正则表达式就是以某种方式来描述字符串。

2.-? //可能有一个负号在前面

\d 表示一位数字

\\ Java中表示要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。如\\d,如果要插入一个普通的反斜线,\\\\,不过换行和制表符之类的东西只需要使用单反斜线\n\t

+ 一个或多个之前的表达式  -?\\d+ //可能有一个负号,后面跟着一位或多位数字

应用正则表达式的最简单途径,就是利用String类内建的功能:String#matches

3.String类还自带了一个非常有用的正则表达式工具,split方法,其功能是"将字符串从正则表达式匹配的地方切开".split还有一个重载的版本,它允许你限制字符串分割的次数。

4.String类自带的最后一个正则表达式工具是替换,你可以只替换正则表达式第一个匹配的字串,或是替换所有匹配的地方。

5.String之外的正则表达式还有更强大的替换工具,如可以通过方法调用执行替换.而且,如果正则表达式不是只使用一次的话,非String对象的正则表达式明显具备更佳的性能。

3.创建正则表达式

1.正则表达式的完整构造子列表,详见Jdk文档java.util.regex包中的Pattern

2.字符类:

[abc] a、b 或 c(简单类)

[^abc] 任何字符,除了 a、b 或 c(否定)

[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)

[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)

[a-z&&[def]] d、e 或 f(交集)

[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)

[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)

预定义字符类

. 任何字符(与行结束符可能匹配也可能不匹配)

\d 数字:[0-9]

\D 非数字: [^0-9]

\s 空白字符:[ \t\n\x0B\f\r]

\S 非空白字符:[^\s]

\w 单词字符:[a-zA-Z_0-o9]

\W 非单词字符:[^\w]

逻辑运算符

XY X 后跟 Y

X|Y X 或 Y

(X) X,作为捕获组

边界匹配器

^ 行的开头

$ 行的结尾

\b 单词边界

\B 非单词边界

\A 输入的开头

\G 上一个匹配的结尾

\Z 输入的结尾,仅用于最后的结束符(如果有的话)

\z 输入的结尾

3.量词

量词描述了一个模式吸收输入文本的方式.

贪婪型:量词总是贪婪的,除非有其他的选项被设置。贪婪表达式会为所有可能的模式发现尽可能多的匹配。导致此问题的一个典型理由就是假定我们的模式仅能匹配第一个可能的字符组,如果它是贪婪的,他们它会继续往下匹配

勉强型:用问号来指定,这个量词匹配满足模式所需的最少字符数。

占有型:目前,这种类型的量词只有在Java语言中才可用。当正则表达式被应用于字符串时,它会产生相当多的状态,一边在匹配失败时可以回溯。而占有的量词并不    保存这些中间状态,因为他们可以防止回溯。他们常常用于防止正则表达式失控,因此可以使正则表达式执行起来更有效。

贪婪型         勉强型         占有型         如何匹配

X?        X??          X?+          一个或0个X

X*        X*?          X*+          0个X或多个X

X+        X+?          X++          一个或多个X

X(n)           X(n)?         X(n)+         恰好n次X

X(n,)        X(n,)?         X(n,)+         至少n次X

X(n,m)       X(n,m)?        X(n,m)+        X至少n次,且不超过m次

注意,表达式X通常必须要用圆括号括起来,以便他能够按照我们期望的效果去执行。

如abc+,这个表达式表达是:匹配ab,后面跟一个或多个c;如果要表明匹配1个或多个完整的abc字符串,需这样表示(abc)+

4.CharSequence

接口CharSequence从CharBuffer.String.StringBuffer,StringBuilder类之中抽象出了字符序列的一般化定义:

interface CharSequence

{

charAt(int i);

length();

subSequence(int start,int end);

toString();

}

因此这些类都实现了该接口,多数正则表达式操作都接受CharSequence类型的参数。

4.Pattern和Matcher

1.一般来说,比起功能有限的String类,我们更愿意构造功能强大的正则表达式对象。只需要导入java.util.regex包,然后用static Pattern.compile方法来编译你的正则表达式即可.它会根据你的String类型的表达式生成一个Pattern对象。接下来,把你想要检索的字符串传入Pattern对象的matcher方法,matcher方法会生成一个Matcher对象,其有许多功能可以用。如其replaceAll方法能将所有匹配的部分替换成你传入的参数。

Pattern对象表示编译后的正则表达式,我们使用已编译的Pattern对象上的matcher方法,加上一个输入字符串,从而共同构造了一个Matcher对象。同时Pattern类还提供了static方法:

static boolean matches(String regex,charSequence input)

该方法用以检查regex是否匹配整个CharSequence类型的input参数。编译后的Pattern还提供了split方法,它从匹配了regex的地方分割输入字符串,返回分割后的子字符串String数组.

通过调用Pattern.matcher()方法,并传入一个字符串参数,我们得到了一个Matcher对象。通过Matcher上的方法,我们将能够判断各种不同类型的匹配是否成功:

boolean matches();

boolean lookingAt();

boolean find();

boolean find(int start)

其中的matches方法用来判断整个输入字符串是否匹配正则表达式模式.而lookingAt()则用来判断该字符串(不必是整个字符串)的其实部分是否能够匹配模式.

Matcher.find方法可以用来在CharSequence中查找多个匹配.

2.组(Groups)

组是用括号划分的正则表达式,可以根据组的编号引用某个组。组号0表示整个表达式,组号1表示被第一对括号括起的组,一次类推。如

A(B(C))D中有三个组,组0是ABCD,组1是BC,组2是C

Match对象提供了一系列化方法,用于获取与组相关的信息:public int groupCount()返回该匹配器的模式中的分组数目,第0组不包括在内。

public String group()返回前一次匹配操作

public String group(i)返回前一次匹配操作期间指定的组号

public int start(int group)返回在前一次匹配中寻找到的组的起始索引

public int end(int group) 返回在前一次匹配操作中寻找到的组的最后一个字符索引加一的值

3.start()与end()

在匹配操作成功之后,start返回先前匹配的起始位置的索引,而end返回匹配的最后字符的索引值加一的值。匹配操作失败之后或先与一个正在进行的匹配操作去尝试,调用start或end将会产生IllegalStateException.

find()可以在输入的任意位置定位正则表达式,而lookingAt和matches只有在正则表达式与输入的最开始匹配时才会成功->matches只有在整个表达式都匹配正则表达式时才会成功,而lookingAt只要输入的第一部分匹配就会成功。

4.Pattern标记

Pattern类的compile方法还有另外一个版本,就是它接受一个参数,以调整匹配的行为:

Pattern Pattern.compile(String regex,int flag);

flag来自Pattern的常量:

1.Pattern.CANON_EQ->匹配规范的等价性,默认不考虑等价性,如表达式a\u03DA会匹配字符串?

2.Pattern.CASE_INSENSITIVE(?!) ->不考虑大小写

3.Pattern.COMMENTS(?x)->空格符和#开始的注释会被忽略掉(unix的行模式)

4.Pattern.DOTALL(?s)->.匹配所有字符包括行终结符,而默认情况下不匹配行终结符

5.Pattern.MULTILINE(?m)->多行模式下,表达式^和&分别匹配一行的开始和结束。^还匹配输入字符串的开始,而$还匹配输入字符串的结尾。默认情况下,这些表达式仅匹配输入的完整字符串的开始和结束。

6.Pattern.UNICODE_CASE(?u)->当指定这个标记并开启CASE_INSENSITIVE时,大小写不敏感的匹配将按照与Unicode标准相一致的方式进行。默认情况下只按US_ASCII字符集进行

7.Pattern.UNIX_LINES(?d)->在.,^,$行为中,只识别行结束符\n

可以通过|组合多个标记

5.split

split方法将输入字符串断开成字符串对象数组,断开边界有正则表达式确定:

String[] split(CharSequence input)

String[] split(CharSequence input,int limit)

该方法可以按照通用边界断开输入文本,第二种形式的方法可以限制将输入分割成字符串的数量。

6.替换操作

正则表达式特别适合替换文本,其提供了许多方法:replaceFirst(String replacement),以参数字符串替换掉第一个匹配的部分;

repalceAll(String replacement),以参数替换所有匹配成功的部分;

appendReplacement(StringBuffer sbuf,String replacement),执行渐进式的替换,其允许你调用其他方法来生成或处理replacement。

appendTail(StringBuffer sbuf),在执行了一次货多次appendReplacement后,调用此方法可以讲输入字符串余下的部分复制到sbuf中。

7.reset

该方法可以将现有的Matcher对象应用于一个新的字符序列.

10.扫描输入

1.Scanner(#next...,扫描基本类型)

2.默认情况下,Scanner根据空白字符(WHITESPACE_PATTERN)对输入进行分词.->可通过#useDelimiter指定定界符

3.#delimiter()返回当前正在作为定界符使用的Pattern对象.

4.Scanner可结合自定义正则表达式进行扫描复杂数据.

Scanner#hasNext(String pattern)

Scanner#next(String pattern)

Scanner#match()

->仅仅针对下一个输入分词进行匹配.(注意和定界符有区别)

11.StringTokenizer

1Java引入正则表达式和Scanner之前的产物.

2.可废弃不用了.

部分源码:

java 输入任何字符继续_Thinking in Java 4th chap13笔记-字符串相关推荐

  1. java 将中文字符转为英文,java 将中文字符号转为英文

    java 将中文字符转为英文,java 将中文字符号转为英文 package test;import java.io.UnsupportedEncodingException;public class ...

  2. java输入一个字符给c赋值_C语言字符串的输入输出

    字符串的输出 在C语言中,输出字符串的函数有两个: puts():直接输出字符串,并且只能输出字符串. printf():通过格式控制符 %s 输出字符串.除了字符串,printf() 还能输出其他类 ...

  3. java输入其他字符提示_Eclipse输入任意字母或指定字符出现提示框

    Eclipse默认是输入"."的时候会有提示框提示对应的API. 如果想更方便的输入任意字母或者指定的符号出现提示框设置如下: 打开Eclipse,选中"Window&q ...

  4. java输入单个字符

    1 初学java时会发现 键盘录入数字类型的比较容易 而录入单个字符的实现就没有那么简单了 第一种方法:通过接收字符串 再接收其第一个字符 import java.util.Scanner; //导包 ...

  5. java读取每个字符_详解Java String字符串获取每一个字符及常用方法

    前言 对于字符串的操作,我们常用的就是trim()去除前后空格.subString()截取子字符串,其他的用的不多.下表中是字符串常用的方法.大家要记一记啊,特别是chartAt()方法比较重要的.因 ...

  6. python输入一个字符一个数字_Python:如何只对字符串中的数字字符加/减一个数字?...

    尽管注释中不鼓励使用regex,但可以使用regex将时间对象解析为datetime.time对象,对它们执行必要的计算,然后以所需格式打印它们:# datetime module for time ...

  7. 【Java】从键盘中任意输入一个字符,判断该字符的类别

    import java.io.*; public class Test {public static void main (String[] args) throws IOException{char ...

  8. 输入一行字符,用Java分别统计出其中英文字母、空格、数字和其他字符的个数。

    输入一行字符,用Java分别统计出其中英文字母.空格.数字和其他字符的个数. package p3;import java.util.*;public class floatlength {publi ...

  9. java 键盘输入密码,(JAVA)从键盘输入一批字符,以@结束,按要求加密并输出

    从键盘输入一批字符,以@结束,按要求加密并输出. 输入 从键盘输入一批字符,占一行,以@结束. 输出 输出占一行 加密规则: 1)所有字母均转换为小写. 2)若是字母'a'到'y',则转化为下一个字母 ...

最新文章

  1. 第十四课.Transformer
  2. mach空串 php preg_PHP 优化详解
  3. GPAC MP4文件写入(支持H264、H265)
  4. Java开发微信之菜单不显示
  5. push_back和emplace_back的区别
  6. OpenCV进行图像相似度对比的几种办法
  7. 模拟退火算法解决np_P和NP问题与解决方案| 演算法
  8. C语言 vprintf 函数和 printf 函数区别 - C语言零基础入门教程
  9. python-pymysql模块的使用入门
  10. leetcode c++未初始化_LeetCode 力扣官方题解 | 538. 把二叉搜索树转换为累加树
  11. jest自动化测试遇到的一些报错信息及解决方案
  12. XPO学习(3)----数据查询
  13. linux下编译运行驱动
  14. CAXA 分解命令x 解决不能选中图形问题。
  15. php自动生成模板文件,Laravel学习笔记之Artisan命令生成自定义模板的方法
  16. 互联网15年风云变幻:改变世界的15个网站
  17. 一款精简的webshell管理工具 -- Assassin
  18. 基于微博平台的python爬虫数据采集
  19. 螺旋线java_java 小测试,关于画螺旋线的问题.
  20. html电子邮件连接,html如何创建电子邮件链接

热门文章

  1. 汇编语言常见错误(转载)
  2. 拓扑检查C++(ArcObject)
  3. 如何证明CPU的乱序执行(Out-of-order Execution)?
  4. Linux进程调度:完全公平调度器 Completely Fair Scheduler 内幕| linux-2.6
  5. Android Hello World 实例【TODO】
  6. Python生态概览(三):图形用户界面开发库、游戏开发库、虚拟现实库、图形艺术库
  7. nginx的目录结构和配置文件
  8. PML之平均 、中值 、众数、标准偏差、方差
  9. web前端基础(09html5多媒体)
  10. lombok的相关注解使用