概念
正则表达式(Regular Expression),又称规则表达式。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。
正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。
java三个类
java.util.regex 包主要包括以下三个类:
Pattern 类
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
import java.util.regex.*;
class RegexExample1{
public static void main(String[] args){
String content = "I am noob " +
"from runoob.com.";
String pattern = ".*runoob.*";
boolean isMatch = Pattern.matches(pattern, content);
System.out.println("字符串中是否包含了 'runoob' 子字符串? " + isMatch);
}
}
复制代码
Matcher 类
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
import java.util.regex.Pattern;
public class RegexMatches
{
public static void main( String[] args ){
// 按指定模式在字符串查找
String line = "This order was placed for QT3000! OK?";
String pattern = "(\\D*)(\\d+)(.*)";
// 创建 Pattern 对象
Pattern r = Pattern.compile(pattern);
// 现在创建 matcher 对象
Matcher m = r.matcher(line);
if (m.find( )) {
System.out.println("Found value: " + m.group(0) );
System.out.println("Found value: " + m.group(1) );
System.out.println("Found value: " + m.group(2) );
System.out.println("Found value: " + m.group(3) );
} else {
System.out.println("NO MATCH");
}
}
}
复制代码
PatternSyntaxException
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
语法
先来个
.*?
的解释吧.
: 单个任意字符*
: 重复多次、贪婪匹配。注意*在正则中不是任意字符,而是一个限定限定出现的次数?
: 出现1次或者0次、非贪婪匹配
范例
提取一个字符串的中文
public static void main(String[] args) {
String str = "123abc这个中文cde123abc也要提取123ab";
Pattern p = null;
Matcher m = null;
String value = null;
p = Pattern.compile("([/u4e00-/u9fa5]+)");
m = p.matcher(str);
while (m.find()) {
value = m.group(0);
System.out.println(value);
}
}
运行结果:
这个中文
也要提取
复制代码
正则表达式拆分字符串
通过竖线分割字符串
// 通过竖线分割字符串
private static void splitByLine() {
String lineStr = "123|456|789";
// split("|")分割得到的字符串数组,每个数组元素只有一个字符,类似于toCharArray的结果
//String[] lineArray = lineStr.split("|");
// 竖线是正则串的保留字符,需要进行转义(在竖线前面加两个反斜杆)
String[] lineArray = lineStr.split("\\|");
for (String item : lineArray) {
System.out.println("line item = "+item);
}
}
复制代码
正则表达式替换字符串
使用正则表达式提取html中指定内容并进行替换
import java.util.regex.*;
public class Main {
public static void main(String[] args) {
String content = "<p><strong>1、new 运算符</strong>:用于创建对象和调用构造函数。这个我们创建对象实例就比较常用了,比如:</p><pre class="prettyprint linenums cs"> StringBuilder str=new StringBuilder();\r\n\r</pre><p><strong>"
+ "2、new 修饰符</strong>:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。简单的说,就是现在写的这个类,想写一个和基类中相同的成员,而不继承基类的。运用多态的特性时,也不会调用这个显示隐藏的方法。具体看下如下代码:"
+ "</p><pre class="prettyprint linenums">using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace ConsoleApp2\r\n{\r\n public class Program\r\n {\r\n static void Main(string[] args)\r\n {\r\n animal a = new animal();\r\n a.name = "animal";\r\n a.say();\r\n cat c = new cat();\r\n c.name = "cat";\r\n c.say();\r\n dog d = new dog();\r\n d.name = "dog";\r\n d.say();\r\n sheep s = new sheep();\r\n s.name = "sheep";\r\n s.say();\r\n animal a1 = new cat();\r\n a1.say();\r\n animal a2 = new dog();\r\n a2.say();\r\n animal a3 = new sheep();\r\n a3.say();\r\n }\r\n }\r\n class animal\r\n {\r\n public string name { get; set; }\r\n public virtual void say()\r\n {\r\n Console.WriteLine("animal say");\r\n }\r\n }\r\n class cat : animal\r\n {\r\n public override void say()\r\n {\r\n Console.WriteLine("cat say");\r\n }\r\n }\r\n class dog : animal\r\n {\r\n public new void say() //这个方法被显示隐藏了\r\n {\r\n Console.WriteLine("dog say");\r\n }\r\n }\r\n class sheep : animal\r\n {\r\n }\r\n\r\n}<br></pre><p><strong>";
String replaced = Pattern.compile("<pre class="prettyprint linenums\s*([a-z]*?)"\s*>(.+?)</pre>",Pattern.DOTALL|Pattern.MULTILINE)
.matcher(content)
.replaceAll(match -> {
System.out.println("------------------");
System.out.println(match.group(1));
System.out.println(match.group(2));
System.out.println(match.group());
System.out.println("------------------");
return "";
});
System.out.println(replaced);
}
}
复制代码
正则表
达式提取字符串
String data = "我的1<if test='case == 1'>1</if>我的2<if test='case == 2'>2</if>";
String regex = "<if test='([\\s\\S]*?)'>([\\s\\S]*?)</if>";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(data);
while (matcher.find()) {
String group = matcher.group();
System.out.println(group);
}
作者:后端Q
链接:https://juejin.cn/post/7154811194304364557
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
技术群:添加小编微信并备注进群
小编微信:mm1552923
公众号:dotNet编程大全