正则表达式引擎是一种可以处理正则表达式的软件。许多语言都支持正则表达式处理文本,例如PHP、Java和JavaScript,一些文本编辑器用正则表达式实现高级搜索-替换功能。Java中加入了java.util.regex包提供对正则表达式的支持,而且Java.lang.String类中的函数也是调用的正则表达式来实现的。接下来将讲解着两方面的使用使用String类的匹配功能:匹配、拆分和替换
使用正则表达式库java.util.reg:查找、提取、分割、替换
1、使用String类的匹配功能
在String中有4个方法可以使用正则表达式,他们是matches()、split()、replaceAll()和replaceFirst()。
matches()方法可以判断当前的字符串是否匹配给定的正则表达式。public boolean matches(String regex);
split()方法可以分隔字符串,并以String数组的形式返回结果。public String[] split(String regex);
public String[] split(String regex,int limit);
replaceAll()和replaceFirst()方法public String replaceAll(String regex,String replacement);
public String replaceFirst(String regex,String replacement);
2、使用正则表达式库Pattern和Matcher
JDK的正则表达式库java.util.reg提供了两个类Pattern和Matcher,用来进行正则表达式的匹配和查找功能。
(1)Pattern表达式
Pattern为字符串的正则表达式,可以直接根据一个正则表达式创建一个Pattern。Pattern p = Pattern.compile("a*b");
(2)Matcher匹配器
使用Pattern对象获得Matcher匹配器对象,然后创建匹配器,可以使用它执行不同的匹配操作。matches()方法尝试将整个输入序列与该模式匹配
lookingAt()方法尝试将输入序列从头开始与该模式匹配
find()方法扫描输入序列以查找与该模式匹配的下一个子序列
3、正则表达式库的4中功能
正则表达式在处理字符串上有强大的功能,主要是使用Matcher的匹配函数,共有4中常用功能。查询---find()
提取---group()
分割---split()
替换---replaceAll()
示例如下:
/**
* 获取xml文本中某个节点的文本值
* @param xml 查找的xml文本
* @param nodeName 节点名称
*
* @return 目标节点的文本值
*/
public static String getNodeText(String xml, String nodeName) {
String regex = "([^<>/]*)\\1>";
Matcher m = Pattern.compile(regex, Pattern.DOTALL).matcher(xml);
if (m.find()) {
return m.group(2);
} else {
return null;
}
}
/**
* 获取SOAP-xml文本中某个节点的文本值
* @param xml 查找的xml文本
* @param nodeName 节点名称
*
* @return 目标节点的文本值
*/
public static String getSoapNodeText(String xml, String nodeName,String prefix) {
nodeName=prefix+":"+nodeName;
String regex = "([^<>/]*)\\1>";
Matcher m = Pattern.compile(regex, Pattern.DOTALL).matcher(xml);
if (m.find()) {
return m.group(2);
} else {
return null;
}
}
/**
* 获取xml文本中某个节点的文本值
* @param xml 查找的xml文本
* @param nodeName 节点名称
*
* @return 目标节点的文本值
*/
public static String getNodeTextByNum(String xml, String nodeName, int num) {
String regex = "([^<>/]*)\\1>";
Matcher m = Pattern.compile(regex, Pattern.DOTALL).matcher(xml);
int i = 1;
while (m.find()) {
if (i++ == num) {
return m.group(2);
}
}
return null;
}
/**
* 获取xml中某节点有重复出现时所有的节点的文本值
* @param xml 查找的xml文本
* @param nodeName 节点名称
*
* @return 目标节点的文本值
*/
public static List getNodeTextList(String xml, String nodeName) {
List list=new ArrayList();
String regex = "([^<>/]*)\\1>";
Matcher m = Pattern.compile(regex, Pattern.DOTALL).matcher(xml);
while (m.find()) {
list.add(m.group(2));
}
return list;
}
/**
* 获取xml文本中报文体内容
* @param xml 查找的xml文本
*
* @return 报文体内容
*/
public static String getXmlBodyText(String xml) {
String regex = "(.+?)";
Matcher m = Pattern.compile(regex, Pattern.DOTALL).matcher(xml);
if (m.find()) {
return m.group(1);
} else {
return null;
}
}