正则表达式操作字符串

概念

正则表达式(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编程大全    

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值