定义:
正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。
要点
1.正则是匹配模式,要么匹配字符,要么匹配位置。
2.在正则中可以使用括号捕获数据,要么在API中进行分组引用,要么在正则里进行反向引用。
正则表达式在JAVA中的应用:
Java 正则表达式和 Perl 的是最为相似的。
java.util.regex 包主要包括以下三个类:
Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
PatternSyntaxException:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
在JAVA中的基础运用
1:捕获数组
2:查询方法
3:替换方法
常被用到的正则表达式
1:如何从字符串中提取数字
在JAVA中, \d表示(0-9)范围的数字.尽量使用正则表达式可以使
请注意\ d中的第一个反斜杠.如果您在字符串文本中使用预定义字符(特殊字符),则必须在反斜杠之前加上另一个反斜杠,以便转义该字符串。 这就是为什么我们需要使用\d
List<Integer> numbers = new LinkedList<Integer>();
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(str);
while (m.find()) {
numbers.add(Integer.parseInt(m.group()));
}
2:如何根据换行来拆分字符串
根据不同的系统,至少有如下3中换行分隔符
\r represents CR (Carriage Return), which is used in Unix
\n means LF (Line Feed), used in Mac OS
\r\n means CR + LF, used in Windows
String lines[] = String.split("\\r?\\n");
String.split("[\\r\\n]+")
String.split(System.getProperty("line.separator"));
Pattern.compile()的重要性
Pattern.compile()方法是创建Pattern对象实例的唯一方法。一般如下使用
//创建Pattern对象
Pattern p = Pattern.compile("a*b");
//创建Matcher对象
Matcher matcher = p.matcher("aaaaab");
//判断是否匹配
assert matcher.matches() == true;
//-----Patternd对象实例p只需创建一次,可以多少使用,匹配不同的Matcher-----------
Matcher anotherMatcher = p.matcher("aab");
assert anotherMatcher.matches() == true;
//-----------Pattern.matches 只能使用一次--------------------------------------------------
boolean b = Pattern.matches("a*b", "aaaaab");
文本类容如果使用表达式
一般使用斜杠""来转译,但在字符串内容时,有些麻烦别扭,这时我么可以使用如下方法,来避免 \]5的写法。
Pattern.quote("$5");
//不使用 \\$5 or [$]5
String.split()的分隔字符串为什么需要先转译
因为在JAVA表达式中支持分隔符,如字符“|”,在JAVA中没有区分开来,
A|B的意思是A或者B,要把斜杠“|”表示成字母,则需要转译
需要在字符“|” 之前添加斜杠 \, 如下 \\|
JAVA表达式如果匹配重复出现n次的情况
如: ab, aabb, and aaabbb
Pattern p = Pattern.compile("(?x)(?:a(?= a*(\\1?+b)))+\\1");
// true
System.out.println(p.matcher("aaabbb").matches());
// false
System.out.println(p.matcher("aaaabbb").matches());
// false
System.out.println(p.matcher("aaabbbb").matches());
// false
System.out.println(p.matcher("caaabbb").matches());
7:如果用单个空格替换2个及以上的空格,及删除最前面空格?
String line = " aa bbbbb ccc d ";
// " aa bbbbb ccc d "
System.out.println(line.replaceAll("[\\s]+", " "));
8:如判断一个素数
public static void main(String[] args) {
// false
System.out.println(prime(1));
// true
System.out.println(prime(2));
// true
System.out.println(prime(3));
// true
System.out.println(prime(5));
// false
System.out.println(prime(8));
// true
System.out.println(prime(13));
// false
System.out.println(prime(14));
// false
System.out.println(prime(15));
}
public static boolean prime(int n) {
return !new String(new char[n]).matches(".?|(..+?)\\1+");
}
9:如何用分隔符分割一个字符串,并忽略逗号。
public static void main(String[] args) {
String line = "aaa,bbb,\"c,c\",dd;dd,\"e,e";
List<String> toks = splitComma(line);
for (String t : toks) {
System.out.println("> " + t);
}
}
private static List<String> splitComma(String str) {
int start = 0;
List<String> toks = new ArrayList<String>();
boolean withinQuote = false;
for (int end = 0; end < str.length(); end++) {
char c = str.charAt(end);
switch(c) {
case ',':
if (!withinQuote) {
toks.add(str.substring(start, end));
start = end + 1;
}
break;
case '\"':
withinQuote = !withinQuote;
break;
}
}
if (start < str.length()) {
toks.add(str.substring(start));
}
return toks;
}
找到重复的内容
String str = "123456";
Pattern p = Pattern.compile("(\\d\\d\\d)\\1");
Matcher m = p.matcher(str);
System.out.println(m.groupCount());
while (m.find()) {
String word = m.group();
System.out.println(word + " " + m.start() + " " + m.end());
}
找到重复一次的单词
String pattern = "\\b(\\w+)\\b[\\w\\W]*\\b\\1\\b";
Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
String phrase = "unique is not duplicate but unique, Duplicate is duplicate.";
Matcher m = p.matcher(phrase);
while (m.find()) {
String val = m.group();
System.out.println("Matching subsequence is \"" + val + "\"");
System.out.println("Duplicate word: " + m.group(1) + "\n");
}
正则表达式资料3
https://github.com/ziishaned/learn-regex
https://github.com/gedoor/learn-regex-zh