正则表达式
正则表达式(Regular Expression)
- 或叫做规则表达式,是计算机科学的一个基础概念
- 用事先定义好的一些特定字符、及这些特定字符的组合,组成一 个“规则字符串”
- 比如:^[A-Za-z]+$, 就代表着一个字符串,只能由26英文字母组成
- 主要作用:
- 测试字符串内的模式
- 识别/替换文本
- 提取文本
正则表达式的定义有很多相关书籍和各种网上资料,在此处给出一本推荐参考书:
精通正则表达式(第三版),Jeffrey E.F.Friedl著, 余晟翻译,电子工业出版社,2012
和一个CSDN的正则表达式汇总文章:最全常用正则表达式大全_ZhaoYingChao88的博客-CSDN博客_最全的常用正则表达式大全
主要来看看Java中的正则表达式
Java正则表达式
主要使用java.util.regex包
–Pattern 正则表达式的编译表示
compile :编译一个正则表达式为Pattern对象
matcher :用Pattern对象匹配一个字符串,返回匹配结果
–Matcher
Index Methods(位置方法) // start(), start(int group), end(), end(int group)
Study Methods(查找方法) // lookingAt(), find(), find(int start), matches()
Replacement Methods(替换方法) //replaceAll(String replacement)
下面呈上使用实例:
第一个:寻找字符串中的“dog”
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class MatcherDemo {
private static final String REGEX = "\\bdog\\b"; // "\b“表示边界
private static final String INPUT = "dog dog dog doggie dogg";
public static void main(String[] args) {
//检查字符串里面有多少个dog
Pattern p = Pattern.compile(REGEX);//编译REGEX得到一个Pattern(模板)对象
Matcher m = p.matcher(INPUT);//用模板来匹配INPUT字符串得到一个Matcher(匹配)对象
int count = 0;
while (m.find()) {
count++;
System.out.println("Match number " + count);
System.out.println("start(): " + m.start());
System.out.println("end(): " + m.end());
}
}
}
输出结果——>:
第二个:部分匹配方法: lookingAt() 与完全匹配方法: matches() 的使用
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class MatchesLooking {
private static final String REGEX = "foo";
private static final String INPUT ="foo-foa-foo";
private static Pattern p;
private static Matcher m;
public static void main(String[] args) {
// Initialize
p = Pattern.compile(REGEX);
m = p.matcher(INPUT);
System.out.println("Current REGEX is: "+ REGEX);
System.out.println("Current INPUT is: "+ INPUT);
System.out.println("lookingAt(): "
+m .lookingAt()); //部分匹配
System.out.println("matches(): "
+ m.matches()); //完全匹配
}
}
输出结果如图:
第三个:替换指定字符串
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexDemo {
private static String REGEX = "a*b"; //*表示限定前面的a可以有0或者多个。
private static String INPUT = "aabfooaabfooabfoobcdd";
private static String REPLACE = "-";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // get a matcher object
StringBuffer sb = new StringBuffer();
//全部替换
while(m.find()){
//用REPLACE中的字符串进行替换,再将替换的结果放到sb变量中
m.appendReplacement(sb,REPLACE);
}
//将最后的尾巴字符串附加上
m.appendTail(sb);
System.out.println(sb.toString());
}
}
输出:-foo-foo-foo-cdd
第四个:将字符串INPUT中的"dog"换成"cat"
public class ReplaceDemo {
private static String REGEX = "dog";
private static String INPUT =
"The dog says meow. All dogs say meow.";
private static String REPLACE = "cat";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// get a matcher object
Matcher m = p.matcher(INPUT);
INPUT = m.replaceAll(REPLACE); //把所有的dog都换成cat
System.out.println(INPUT);
}
}
其他字符串操作
-
字符串和集合互转
import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Scanner; import org.apache.commons.lang3.StringUtils; /** * 采用Apache Commons Lang 来完成字符串和集合转化 * @author Tom * */ public class String2List { public static void main(String[] args) { List<String> names = new LinkedList<String>(); names.add("Xiaohong"); names.add("Xiaoming"); names.add("Daming"); names.add("Xiaohei"); //从ArrayList变到字符串 String str1 = String.join(",", names); //String.join, JDK 8 引入 System.out.println(str1); //out: Xiaohong,Xiaoming,Daming,Xiaohei String str2 = StringUtils.join(names, ","); //Apache Commons Lang System.out.println(str2); //out: Xiaohong,Xiaoming,Daming,Xiaohei //从字符串变回ArrayList List<String> names2 = Arrays.asList(str2.split(",")); for(String name:names2) { System.out.println(name); } //StringUtils 可以支持更多数据类型 List<Integer> ids = new ArrayList<Integer>(); ids.add(1); ids.add(3); ids.add(5); String str3 = StringUtils.join(ids, ","); System.out.println(str3); //out: 1,3,5 } }
//以下方法多来自于Google的com.google.common.*; List<Integer> list = new ArrayList<Integer>(); list.add(123); list.add(456); System.out.println(list); //out: [123,456] //直接初始化List数组 List<Integer> integers = Lists.newArrayList(123, 456); System.out.println(integers); //out:[123,456] //拆分字符串,忽略空字符串 Iterable<String> split = Splitter.on(',') .trimResults() .omitEmptyStrings() .split("123,321,, abc"); for (String s : split) { System.out.print(s+" "); } //out: 123 321 abc
-
变量名字格式化
–名字驼峰命名String s1 = "CONSTANT_NAME"; String s2 = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, s1); System.out.println(s2); //constantName;
-
字符串输入流
Scanner就不用多说了吧,应该都熟悉import org.apache.commons.io.Charsets; import org.apache.commons.io.IOUtils; import java.io.IOException; import java.io.InputStream; import java.util.LinkedList; import java.util.List; import java.util.Scanner; /** * 采用Apache Commons IO 完成字符串转成字符流 * @author Tom * */ public class String2InputStream { public static void main(String[] args) throws IOException { //构造字符串列表 List<String> names = new LinkedList<String>(); names.add("Xiaohong"); names.add("Xiaoming"); names.add("Daming"); names.add("Xiaohei"); //合并为一个字符串,以逗号相连 String nameStr = String.join(",",names); //将字符串作为默认的输入流 InputStream in = IOUtils.toInputStream(nameStr, Charsets.toCharset("UTF-8")); //重置系统的输入流 System.setIn(in); //此处也可以换成一个文件输入流,如:Scanner sc = in; Scanner sc=new Scanner(System.in); sc.useDelimiter(","); while(sc.hasNext()) { System.out.println(sc.next()); } } }
有许多源码和参考资料是来自华东师范大学陈良育老师
他在MOOC上有开课,大家可以关注一下