加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式

发布时间:2020-12-13 23:06:52 所属栏目:百科 来源:网络整理
导读:问题: 1.如果我的需求是按照""来切,至少有一个,怎么写正则表达式?? 2.Greedy 数量词 Reluctant 数量词 Possessive 数量词这三个数量词都表示什么意思?? public static void main(String[] args) { split("c:\puba.txt\abcdefg","");/

问题:

  1.如果我的需求是按照""来切,至少有一个,怎么写正则表达式??
  2.Greedy 数量词 Reluctant 数量词 Possessive 数量词这三个数量词都表示什么意思??

public static void main(String[] args) {
  split("c:\puba.txt\abcdefg","");//如果我的需求是按照""来切,至少有一个,怎么写正则表达式??
  //"\+"可以完美解决问题,但是和"+"之间的区别是什么呢?
  }
  public static String[] split(String s,String regex){
  String[] arr= s.split(regex);
  for(String str :arr){
  System.out.println(str);
  }
  return arr;
  }
   //“”反斜杠如果是单数,也许会报错,
  //因为一些字符没有转义字符,如:“p”
  //“”代表转移字符“”
  查看String.java源码,可看到split可接收的字符串必须满足以下两个要求:
  1、当接收的字符串长度为1,要保证它不是“。$|()[{^?*+”其中任一字符;""长度为1,且为特殊字符一员,
  那么如果正则写成“”就会报错了,但是+是不会报错的
  2、当接收的字符串长度为2时,字符串第一位字符是反斜杠,但第二位字符不能是ASCII格式的数字或字母;"\"长度为2,且第二位字符是'',故能正常切割。
  String.java源码中split相关部分内容:

 public String[] split(String regex) {
  return split(regex,0);
  }
  public String[] split(String regex,int limit) {
  /* fastpath if the regex is a
  (1)one-char String and this character is not one of the
  RegEx's meta characters ".$|()[{^?*+",or
  (2)two-char String and the first char is the backslash and
  the second is not the ascii digit or ascii letter.
  java中的正则位于java.util.regex包中,这个包中只有一个MatchResult接口和Matcher、Pattern两个类。正则中的数量词有Greedy (贪婪)、Reluctant(懒惰)和
Possessive(强占)三种:
  Greedy 数量词
  X?X,一次或一次也没有
  X*X,零次或多次
  X+X,一次或多次
  X{n}X,恰好 n 次
  X{n,}X,至少 n 次
  X{n,m}X,至少 n 次,但是不超过 m 次
  Greedy是最常用的,它的匹配方式是先把整个字符串吞下,然后匹配整个字符串,如果不匹配,就从右端吐出一个字符,再进行匹配,直到找到匹配或把整个字符串吐完为止。
  [java] view plaincopy
  Matcher m=Pattern.compile("a.*b")
  .matcher("a====b=========b=====");
  while(m.find()){
  System.out.println(m.group());
  }
  输出:
  a====b=========b
  因为总是从最大 匹配开始匹配,故称贪婪。
  Reluctant 数量词
  X??X,一次或一次也没有
  X*?X,零次或多次
  X+?X,一次或多次
  X{n}?X,恰好 n 次
  X{n,}?X,至少 n 次
  X{n,m}?X,至少 n 次,但是不超过 m 次
  Reluctant正好和Greedy相反,它先从最小匹配开始,先从左端吞入一个字符,然后进行匹配,若不匹配就再吞入一个字符,直到找到匹配或将整个字符串吞入为止。
  [java] view plaincopy
  Matcher m=Pattern.compile("a.*?b")
  .matcher("a====b=========b=====");
  while(m.find()){
  System.out.println(m.group());
  }
  输出:
  a====b
  因为总是从最小匹配开始,故称懒惰。
  Possessive 数量词
  X?+X,一次或一次也没有
  X*+X,零次或多次
  X++X,一次或多次
  X{n}+X,恰好 n 次
  X{n,}+X,至少 n 次
  X{n,m}+X,至少 n 次,但是不超过 m 次
  Possessive和Greedy的匹配方式一样,先把整个字符串吞下,然后匹配整个字符串,如果匹配,就认为匹配,如果不匹配,就认为整个字符串不匹配,它不会从右端吐出一个字符串再进行匹配,只进行一次
  [java] view plaincopy
  Matcher m=Pattern.compile("a.*+b")
  .matcher("a====b=========b=====");
  while(m.find()){
  System.out.println(m.group());
  }
  输出:
  因为贪婪但并不聪明,故称强占。
   正则表达式:   好处:正则的出现,对字符串的复杂操作变得更为简单。   特点:将对字符串操作的代码用一些符号来表示。只要使用了指定符号,就可以调用底层的代码对字符串进行操作。符号的出现,简化了代码的书写。   弊端:符号的出现虽然简化了书写,但是却降低了阅读性。   其实更多是用正则解决字符串操作的问题。   组:用小括号标示,每定义一个小括号,就是一个组,而且有自动编号,从1开始。   只要使用组,对应的数字就是使用该组的内容。别忘了,数组要加。   (aaa(wwww(ccc))(eee))技巧,从左括号开始数即可。有几个左括号就是几组。   常见操作:   1,匹配:其实用的就是String类中的matches方法。   String reg ="[1-9][0-9]{4,14}";   boolean b = qq.matches(reg);//将正则和字符串关联对字符串进行匹配。   2,切割:其实用的就是String类中的split方法。   3,替换:其实用的就是String类中的replaceAll();   4,获取:   1),先要将正则表达式编译成正则对象。使用的是Pattern中静态方法 compile(regex);   2),通过Pattern对象获取Matcher对象。   Pattern用于描述正则表达式,可以对正则表达式进行解析。   而将规则操作字符串,需要从新封装到匹配器对象Matcher中。   然后使用Matcher对象的方法来操作字符串。   如何获取匹配器对象呢?   通过Pattern对象中的matcher方法。该方法可以正则规则和字符串想关联。并返回匹配器对象。   3),使用Matcher对象中的方法即可对字符串进行各种正则操作。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读