Java学习笔记:常用字符串方法和正则表达式

  • String类
    -字符串并置
public class Main {
    public static void main(String[] args) {
        String a = "1";
        String b = "2";
        String c = "1" + "2";
        String d = a + b;
        System.out.println(c == "12");
        System.out.println(d == "12");
    }

}

上面输出c和的结果为12,但是:
c == “12” 输出true
d == “12” 输出flase
因为:d = a+b中的a,b是变量,而“1”,“2”是常量,是放置在常量池里的。

  • startsWith方法和endWith方法
    判断是否以…为开头和结尾
public class Main {
    public static void main(String[] args) {
        String a = "123sff3442";
        String b = "2";
        String c = "123";
        System.out.println(a.startsWith("1"));
        System.out.println(a.endsWith("42"));
    }

}
  • 比较大小
public class Main {
    public static void main(String[] args) {
        String a = "asd";
        String b = "abc";
        String c = "nas";
        System.out.println(a.compareTo(b));
        System.out.println(a.compareTo(c));
        System.out.println(a.compareTo("asd"));
    }
}
/**
17
-13
0

Process finished with exit code 0
*/
  • 排大小
import java.util.Arrays;
int[] aa = {2, 6, 8, 3, 0, 88, 43, 1};
        Arrays.sort(aa);
        int i = 0;
        for (i = 0;i<aa.length;i++)
            System.out.print(aa[i] + "  ");
 /*
 0  1  2  3  6  8  43  88  
Process finished with exit code 0
*/           
  • indexOf(),查找第一个字符/字符串在第几个位置,(从0算起)
  • lastIndexOf():查找最后一个字符/字符串在…
  • boolean contains(String s):判断是否包含
  • substring(int sta,int end):截出某一段
  • pubilc String trim()
    String对象调用方法trim()得到一个新的 String对象,这个新的 String对象的字符序列是当前 String对象的字符序列去掉前后空格后的字符序列。
  • 输出当前时间,可以用Date类+toString
import java.util.Date;
public class Main {
    public static void main(String args[]) {
        Date date = new Date();
        System.out.println(date.toString());
    }
}
  • getChars
    下面是从s的下标2到6截出串,放到从c的下标0开始后面开始存放。需要注意的是,必须保证数组c能容纳下要被复制的字符。
public class Main {
    public static void main(String[] args) {
      
        String s = "1234556";
        char[] c = new char[4];
        s.getChars(2, 6, c, 0);
        System.out.println(c);
    }
}
/*
3455

Process finished with exit code 0
*/
  • simpleDateFormat方法,格式化时间,里面的parse可以转化为至今的毫秒数。parse要记得使用try-catch,否则运行时异常。
package EXP2020.exp7;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Scanner;

/**
 * @author JMChen
 * @date 2020/4/22 8:29
 */
public class hw {
    private static long parseTime(String strTime) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        long time = 0L;
        try {
            time = format.parse(strTime).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return time;
    }

    public static void main(String args[]) {
        System.out.println("请输入存款起始时间:(按xxxx-xx-xx格式输入)");
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

        long t = parseTime(s);
        System.out.println(t);
    }
}


正则表达式

  • String对象调用public boolean matches(String regex)方法可以判断当前String对象的字符
    序列是否和参数regex指定的正则表达式匹配。
  • [abc]:代表a、b、c中的任何一个;
    [^abc]:代表除了 a, b、c以外的任何字符;
    [a-zA-Z]:代表英文字母(包括大写和小写)中的任何一个;
    [a-d]:代表a~d中的任何一个。
    另外,中括号里允许嵌套中括号,可以进行并、交、差运算,例如:
    [a-d[m-p]]:代表a〜d,或m~p中的任何字符(并);
    [a-z&&[def]]:代表d、e或f中的任何一个(交);
    [a-f&&[^bc]]:代表 a、d、e、f (差)。

eg:匹配由数字或字母或下划线组成的字符串

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String regex = "[a-zA-Z|0-9|_]+";
        String str = sc.nextLine();
        if (str.matches(regex)) {
            System.out.println("yes");
        } else System.out.println("no");

    }
}
/*
wqey823ed873e87IG2
yes
1 2e
no
*/
  • replaceAll(str1,replstr)
    注:String对象调用replaceAll()方法返回一个新的String对象,但不改变当前String时象的字符序列。
  • 注意
表达式 作用
^ 与字符串开始的地方匹配,不匹配任何字符
$ 与字符串结束的地方匹配,不匹配任何字符
\b 匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符
\s 匹配包括空格、制表符、换页符等空白字符的其中任意一个

举例1:表达式 “^aaa” 在匹配 “xxx aaa xxx” 时,匹配结果是:失败。因为 “^” 要求与字符串开始的地方匹配,因此,只有当 “aaa” 位于字符串的开头的时候,"^aaa" 才能匹配,比如:“aaa xxx xxx”。

举例2:表达式 “aaa " x x x a a a x x x " " ”在匹配"xxxaaaxxx"时,匹配结果是:失败。因为" ” 要求与字符串结束的地方匹配,因此,只有当 “aaa” 位于字符串的结尾的时候,“aaa$” 才能匹配,比如:“xxx xxx aaa”。

举例3:表达式 “.\b.” 在匹配 “@@@abc” 时,匹配结果是:成功;匹配到的内容是:"@a";匹配到的位置是:开始于2,结束于4。
表达式 “\bend\b” 在匹配 “weekend,endfor,end” 时,匹配结果是:成功;匹配到的内容是:“end”;匹配到的位置是:开始于15,结束于18。

举例4:表达式 “(go\s*)+” 在匹配 “Let’s go go go!” 时,匹配结果是:成功;匹配到内容是:“go go go”;匹配到的位置是:开始于6,结束于14。

举例5:表达式 “¥(\d+.?\d*)” 在匹配 “$10.9,¥20.5” 时,匹配的结果是:成功;匹配到的内容是:“¥20.5”;匹配到的位置是:开始于6,结束于10。单独获取括号范围匹配到的内容是:“20.5”。

  • 进一步说明:"\b" 与 “^” 和 “$” 类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是 “\w” 范围,另一边是 非"\w" 的范围。
  • 匹配次数中的贪婪与非贪婪
    在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:"{m,n}", “{m,}”, “?”, “*”, “+”,具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。比如,针对文本 “dxxxdxxxd”
项目 Value
(d)(\w+) “\w+” 将匹配第一个 “d” 之后的所有字符 “xxxdxxxd”
(d)(\w+)(d) \w+” 将匹配第一个 “d” 和最后一个 “d” 之间的所有字符“xxxdxxx”。虽然 “\w+” 也能够匹配上最后一个 “d”,但是为了使整个表达式匹配成功,"\w+" 可以 “让出” 它本来能够匹配的最后一个 “d”

由此可见,"\w+" 在匹配的时候,总是尽可能多的匹配符合它规则的字符。
带 “*” 和 “{m,n}” 的表达式都是尽可能地多匹配,带 “?” 的表达式在可匹配可不匹配的时候,也是尽可能的 “要匹配”。这 种匹配原则就叫作 “贪婪” 模式 。

  • 非贪婪模式:
    在修饰匹配次数的特殊符号后再加上一个 “?” 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 “不匹配”。这种匹配原则叫作 “非贪婪” 模式,也叫作 “勉强” 模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。举例如下,针对文本 “dxxxdxxxd”
表达式 匹配结果
(d)(\w+?) “\w+?” 将尽可能少的匹配第一个 “d” 之后的字符,结果是:"\w+?" 只匹配了一个 “x”
(d)(\w+?)(d) 为了让整个表达式匹配成功,"\w+?" 不得不匹配 “xxx” 才可以让后边的 “d” 匹配,从而使整个表达式匹配成功。因此,结果是:"\w+?" 匹配 “xxx”
发布了15 篇原创文章 · 获赞 18 · 访问量 912

猜你喜欢

转载自blog.csdn.net/weixin_44983848/article/details/105644225