JAVA中的正则表达式(pattern/match)

论坛 期权论坛 脚本     
匿名网站用户   2020-12-20 05:30   34   0

正则表达式概念

所谓正则表达式就是处理字符串的特殊字符串
用途
 字符串匹配(字符匹配)
 字符串查找(是建立在匹配之上的查找)
 字符串替换(是建立在查找的结果之后的替换)
例如
 IP地址是否正确
 从网页中揪出Email地址
 从网页揪出链接
类
 java.lang.String
 java.util.regex.Pattern
 java.util.regex.Matcher
要点  
 //一个反斜线
 String str1 = "\\";
 //正则表达式的一个反斜线使用两个反斜线,在java中表示就再需要两个反斜线转义
 System.out.println(str1.matches("\\\\"));
 //POSIX Style,这种写法不建议使用,如果要使用查API
 System.out.println("a".matches("\\p{Lower}"));
 //空白行
 " \n".matches("^[\\s&&[^\n]]*\\n$");
 //邮箱
 String regex1 = "[\\w[.-]]+";
 String regex2 = "@";
 String regex3 = "[\\w[.-]]+";
 String regex4 = "\\.";
 String regex5 = "[\\w]+";
 String regex = regex1+regex2+regex3+regex4+regex5;
 System.out.println("156112846@qq.com".matches(regex));

正则表达式的基本语法

普通字符(字母,数字,汉字,下划线)  
 一个普通字符在表达式中只匹配与之相同的一个字符
 表达式k在字符串sky进行匹配时,将匹配成功
\r,\n,\t,\f
 表示回车符,换行符,制表符,换页符
. 
 任意一个字符
X? 
 表示X可以出现0次或者1次
X+ 
 表示X可以出现1次或者多次
X*
 表示X可以出现任意次
X{n}
 表示X可以出现n次
X{m,n}
 表示X可以最少出现m次,最多出现n次
X{n,}
 表示X最少出现n次
[ ]
 匹配中括号中任意一个字符
[^ ]
 匹配中括号中字符之外的任意一个字符
\d
 表示0~9之间的任意一个数字字符,即[0-9]
\D
 表示0~9之外的任意数字字符,即[^0-9]
\r,\n,\t,\f
 表示回车符,换行符,制表符,换页符
\s
 表示空格,制表符,换页符等空白字符的任意一个
\S
 表示空白字符以外的任意一个字符,即[^\s]
\w
 表示字母,数字,下划线中的任意一个字符,即[a-zA-Z_0-9]
\W
 表示字母,数字,下划线以外的任意一个字符,即[^a-zA-Z_0-9]
^
 该符号不匹配任何字符,字符串开始的位置,即^h必须以h开头
$
 该符号不匹配任何字符,字符串结束的位置,即r$必须以r结尾
\b
 该符号不匹配任何字符,表示单词的边界
\B
 该符号不匹配任何字符,表示非单词的边界,即[^\b]
|
 用来连接两个表达式,表示或的关系
 X|Y 表示X或者Y中的任意字符
()
 作为一个单元,一个分组
\n(n表示一个数字)
 有分组的情况下,表示对分组的引用
 \1表示对分组1的引用
\
 转义字符,当一个符号自身有意义而又要表示这个字符的时候,就需要转义
 \^表示^,\$表示$
?
 如果在?,+,*,{n},{m,n},{n,}后面,表示次数按非贪婪模式进行匹配,
  即按照匹配模式进行最小限度的匹配

贪婪 VS 非贪婪 VS 独占


import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class Test {
 public static void main(String[] args) throws Exception {
  String str = "aaaa5bbbb6";
 
  /*
   * 贪婪的
   * 一次吃进最多的10个字符,不匹配,再吐出来一个,匹配了,结束了
   */
  String regex1 = ".{3,10}[0-9]";
  Matcher m1 = Pattern.compile(regex1).matcher(str);
  if (m1.find())
   System.out.println(m1.start() + "-" + m1.end());
  else
   System.out.println("not match!");
 
  /*
   * 非贪婪的
   * 一次吃进最少的3个字符,然后看后面哪个是不是数字,
   * 再吞一个,然后再看后面哪个是不是数字,匹配了,结束了
   */
  regex1 = ".{3,10}?[0-9]";
  m1 = Pattern.compile(regex1).matcher(str);
  if (m1.find())
   System.out.println(m1.start() + "-" + m1.end());
  else
   System.out.println("not match!");
 
  /*
   * 独占的
   * 一次吃进最多的10个字符,不匹配,不吐出来,不匹配了,结束了
   */
  regex1 = ".{3,10}+[0-9]";
  m1 = Pattern.compile(regex1).matcher(str);
  if (m1.find())
   System.out.println(m1.start() + "-" + m1.end());
  else
   System.out.println("not match!");
 }
}
/*
打印结果:
 0-10
 0-5
 not match!
*/

转载地址:https://blog.csdn.net/itlwc/article/details/10145987

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP