假设仅仅查找hi俩字母
很多单词里包含hi这两个连续的字符,比如him,history,high等等。用hi来查找的话,这里边的hi也会被找出来。如果要精确地查找hi这个单词的话,我们应该使用**"\bhi\b"。**
\b
匹配一个字边界,即字与空格间的位置。例如,“er\b"匹配"never"中的"er”,但不匹配"verb"中的"er"。
从一个字符串中查找出类似
010-89153248
0431-4512742
(010)-89153248
(0431)-4512742
* "\D" 非数字字符匹配。等效于 [^0-9] \\转义
* "\d" 数字字符匹配。 等效[0-9]
* "." 匹配任意字符
* "*" 零次或多次匹配前面的字符或子表达式
* "?" 零次或多次匹配前面...
* "+" 一次或多次匹配...
* "\d{2-5}" 2到5位纯数字
Java对于"\"的处理特殊
在其他语言中,\\ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。
在 Java 中,\\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。
【其他语言单倍,Java双倍】
所以,在其他的语言中(如Perl),一个反斜杠 \ 就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个 \\ 代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是 \\d,而表示一个普通的反斜杠是 \\\\。
包含0开头3位区号-8位电话号码,或 0开头4位区号-7位电话号码
System.out.println("\n==包含0开头3位区号-8位电话号码,或 0开头4位区号-7位电话号码==");
String contest = "what 452 the f***" + "how are you ? " + "fine.com" + "010-89153248";
String pattern = ".*0\\d{2}-\\d{8}.*|.*0\\d{3}-\\d{7}.*";
System.out.println(contest);
boolean isMatch = Pattern.matches(pattern, contest);
System.out.println("匹配吗?"+isMatch);
包含0开头3位区号(可带小括号)-8位电话号码,或 0开头4位区号-7位电话号码
System.out.println("\n==包含0开头3位区号(可带小括号)-8位电话号码,或 0开头4位区号-7位电话号码==");
contest = "what 452 the f***" + "how are you ? " + "fine.com" + "(010)-89153248";
pattern = ".*\\(?0\\d{2}\\)?-\\d{8}.*|.*\\)0\\d{3}\\)?-\\d{7}.*";
System.out.println(contest);
isMatch = Pattern.matches(pattern, contest);
System.out.println("匹配吗?"+isMatch);
分组找出数字电话号码, contest整体算第一组
System.out.println("==分组找出数字, contest本身算第一组==");
String contest = "This order was placed for QT3000! OK?";
String pattern = "(\\D*)(\\d+)(.*)";
// 创建Pattern对象, 编译给定的正则表达式
Pattern ptn = Pattern.compile(pattern);
// 创建Match对象
Matcher mtc = ptn.matcher(contest);
if (mtc.find()) {
for (int i = 0; i < mtc.groupCount()+1; i++) {
System.out.println(mtc.group(i));
}
}else {
System.out.println("no match");
}
System.out.println("\n==包含0开头3位区号-8位电话号码,或 0开头4位区号-7位电话号码==");
contest = "what 452 the f***" + "how are you ? " + "fine.com" + "010-89153248";
pattern = ".*0\\d{2}-\\d{8}.*|.*0\\d{3}-\\d{7}.*";
System.out.println(contest);
boolean isMatch = Pattern.matches(pattern, contest);
System.out.println("匹配吗?"+isMatch);
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class demo {
public static void main(String[] args) {
/*
* "\D" 非数字字符匹配。等效于 [^0-9] \\转义
* "\d" 数字字符匹配。 等效[0-9]
* "." 匹配任意字符
* "*" 零次或多次匹配前面的字符或子表达式
* "?" 零次或多次...
* "+" 一次或多次...
* "\d{2-5}" 2到5位纯数字
* */
System.out.println("==分组找出数字, contest本身算第一组==");
String contest = "This order was placed for QT3000! OK?";
String pattern = "(\\D*)(\\d+)(.*)";
// 创建Pattern对象, 编译给定的正则表达式
Pattern ptn = Pattern.compile(pattern);
// 创建Match对象
Matcher mtc = ptn.matcher(contest);
if (mtc.find()) {
for (int i = 0; i < mtc.groupCount()+1; i++) {
System.out.println(mtc.group(i));
}
}else {
System.out.println("no match");
}
System.out.println("\n==包含0开头3位区号-8位电话号码,或 0开头4位区号-7位电话号码==");
contest = "what 452 the f***" + "how are you ? " + "fine.com" + "010-89153248";
pattern = ".*0\\d{2}-\\d{8}.*|.*0\\d{3}-\\d{7}.*";
System.out.println(contest);
boolean isMatch = Pattern.matches(pattern, contest);
System.out.println("匹配吗?"+isMatch);
System.out.println("\n==包含0开头3位区号(可带小括号)-8位电话号码,或 0开头4位区号-7位电话号码==");
contest = "what 452 the f***" + "how are you ? " + "fine.com" + "(010)-89153248";
pattern = ".*\\(?0\\d{2}\\)?-\\d{8}.*|.*\\)0\\d{3}\\)?-\\d{7}.*";
System.out.println(contest);
isMatch = Pattern.matches(pattern, contest);
System.out.println("匹配吗?"+isMatch);
System.out.println("\n==============================");
contest = "what 452 the f***" + "how are you ? " + "fine.com" + "(010)-89153248";
pattern = "(\\D*)(\\(0\\d{2}\\)-\\d{8})"; //正则匹配
System.out.println(contest);
ptn = Pattern.compile(pattern);
mtc = ptn.matcher(contest);
if (mtc.find()) {
for (int i = 0; i < mtc.groupCount()+1; i++) {
System.out.println(mtc.group(i));
}
}else {
System.out.println("no match");
}
}
}
<!--参考网址-->
<a href>https://deerchao.cn/tutorials/regex/regex.htm</a>
反义,即需要查找不属于某个能简单定义的字符类的字符。
code | comment |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
例子:
查找
System.out.println("\n=========查找尖括号内K开头单词*代表一个以上字符======================" );
contest = "what 452 the f***" + "" +"" + "(010)-89153248";
pattern = ".*]+>.*" ;
System.out.println(contest);
isMatch = Pattern.matches(pattern, contest);
System.out.println("匹配吗?"+isMatch);
后向引用匹配重复单词
go go go或skt skt
System.out.println("\n=========匹配重复的单词go go go skt skt==================");
contest = "what 452 the f***" + ".go go go skt-"+ "(010)-89153248";
pattern = ".*\\b(\\w+)\\b\\s+\\1\\b.*";
System.out.println(contest);
isMatch = Pattern.matches(pattern, contest);
System.out.println("匹配吗?"+isMatch);
(?#comment)