Skip to content

字符串

  • 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 的早期版本中,它是线程安全的。
    • 因此在单线程环境下,StringBuilderStringBuffer 拥有更好的性能
  • String方法

  • image-20231117130836208

  • image-20231117130901638

  • 文本块(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":带正负号,保留两位小数的浮点数。
  • image-20231117133249357

正则表达式

  • 注意需要是哦那个二倍\
  • 如匹配数字-?\\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()以及高精度类型等
  • 默认情况下使用空格作为分隔符

    • 自定义分隔符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); } }