字符串
- String对象不可修改,每次修改实际上会创建一个新的对象
- StringBuilder
- 允许在原有对象上修改字符串,避免反复创建新对象,在需要频繁修改的场景下效率更高
- 常用方法
append(...)
:向StringBuilder
添加文本。insert(int offset, ...)
:在指定位置插入文本。delete(int start, int end)
:删除指定范围的字符。deleteCharAt(int index)
:删除指定位置的字符。replace(int start, int end, String str)
:替换指定范围的字符。toString()
:返回StringBuilder
内容的字符串表示。
- 最终转化为字符串
toString()
-
对于不涉及循环的简单字符串拼接
'a'+'b'+'c'
编译器会自动优化为StringBuilder -
stringbuilder 与 stringbuffer
StringBuilder
类是在 Java 5 引入的,它不是线程安全的,而StringBuffer
类存在于 Java 的早期版本中,它是线程安全的。- 因此在单线程环境下,
StringBuilder
比StringBuffer
拥有更好的性能。
-
String方法
-
文本块(JDK15)
""" xxx, xxx """
- 不保留缩进
- 自动换行
格式化字符串¶
- 使用printf/format
system.out.printf("rOW 1: [%d %f]%n",x,y);
Formatter formatter = new Formatter(); formatter.format("Name: %s, Age: %d", "Alice", 24); String result = formatter.toString(); // 结果为 "Name: Alice, Age: 24"
-
简单的一次性方式
String result = String.format("Hi, %s. Next year, you'll be %d.", "Alice", 30);
-
格式说明符
- 更细致的控制间距及对齐方式
%[argument_index$][flags][width][.precision]conversion
%
(必须):表示格式说明的开始。argument_index$
(可选):整数值,指定要格式化的参数的位置。例如,1$
表示格式化第一个参数。flags
(可选):控制输出格式的标志,例如-
表示左对齐,+
表示输出正负号,0
表示必要时用0填充。width
(可选):整数值,表示最小输出宽度。如果实际数据宽度小于此值,将会根据标志添加空格或其他字符。.precision
(可选):用于浮点数和字符串的格式化,指定小数点后的位数或字符串的最大长度。conversion
(必须):字符,表示要应用的转换类型,如d
代表十进制整数,s
代表字符串,f
代表浮点数等。
- 举例
"%1$d, %2$s"
:格式化第一个参数为整数,第二个参数为字符串。"%-10d"
:左对齐,最小宽度为 10 的整数。"%+.2f"
:带正负号,保留两位小数的浮点数。
正则表达式¶
- 注意需要是哦那个二倍
\
-
如匹配数字
-?\\d+
、符号或正号-|\\+
-
可以将正则传入String的split进行拆分(如非字母
\\W
) -
也可以作为replace等方法的参数
-
量词
- 贪婪型:匹配尽可能多的匹配项
- 勉强型:最小匹配
- 末尾加?
-
占有型(Java独有):在匹配时会尽可能多地捕获字符,并且一旦捕获,不会放弃匹配的字符,即使这可能导致整个模式匹配失败(不符合后面的条件了)。这与标准的贪婪量词不同,后者在需要时会放弃一部分匹配以使整个模式成功匹配。
- 末尾加+
-
编译正则表达式(将字符串编译为正则表达式对象)
-
Pattern.compile(String)
-
pattern标记参数,影响匹配的行为
- 也可以直接将()放在正则string前面
Pattern.CASE_INSENSIVE(?i)
忽略USASCII字符集中的大小写Pattern.COMMENTS(?x)
忽略空白符以及以#开头的注释Pattern.MULTILINE(?m)
多行模式,开头和结尾变成针对每一行-
可以使用|组合标记
-
p.split(CharSequence(待匹配),int limit)
-
limit表示限制拆分次数,即只进行limit次拆分
-
应用
Matcher m = p.matcher(String)
s.replaceFirst(String pattern, String ss)
replaceAll
while (matcher.find()) {
matcher.appendReplacement(sb, "dog");
}
//很灵活 matcher.appendReplacement(sb, m.group().toUpperCase()); 可以每次替换时进行一定的处理
matcher.appendTail(sb);
System.out.println(sb.toString());
find()
方法。
- 对于每个匹配,调用 appendReplacement(StringBuffer sb, String replacement)
方法。这个方法会将上次匹配后(或从开始)到这次匹配前的部分追加到 sb
中,然后追加 replacement
替换的字符串。
- 完成所有匹配后,可以使用 appendTail(StringBuffer sb)
方法将剩余的字符串追加到 sb
中。
Matcher对象¶
- find
//类似迭代器访问 while(m.find()) System.out.print(m.group() + " "); //表示搜索的开始位置 while(m.find(i)) { System.out.print(m.group() + " "); i++; }
- matches要求整个字符串与模式匹配
-
lookingAt要求开始部分匹配
-
分组
A(B(C))D
有三个分组ABCD BC C
int groupCount()
分组数目(不含分组0)group(int i=0)
返回前一次匹配操作的第i个分组int start(int group)
前一次匹配操作中找到的分组的启始索引public int end(int group)
~最后一个字符的索引+1- 重置绑定到新的对象
m.reset(String)
扫描输入¶
- 读入文本进行分词解析
- 使用SCanner
SCanner stdin =new Scanner(input);
- SCanner的构造器支持各种输入类型:File、InputStream、String等
- 使用nextxx读取并解析各种类型的数据文本
-
next()
默认读取String类型- 还有各种基本类型(不含char),还有
nextInt()
、nextDouble()
以及高精度类型等
- 还有各种基本类型(不含char),还有
-
默认情况下使用空格作为分隔符
- 自定义分隔符
scanner.useDelimiter("\\s*,\\S*")
使用任意空白符包含的逗号进行分割
- 自定义分隔符
-
使用正则扫描 ``` java public static void main(String [] args) { Scanner scanner = new Scanner(threatData); String pattern = "(\d+[.]\d+[.]\d+[.]\d+)@" + "(\d{2}/\d{2}/\d{4})"; while(scanner.hasNext(pattern)) { scanner.next(pattern); MatchResult match = scanner.match(); String ip = match.group(1); String date = match.group(2); System.out.format( "Threat on %s from %s%n", date, ip); } }