正则表达式引擎是一种可以处理正则表达式的软件。许多语言都支持正则表达式处理文本,例如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 = "<(" + nodeName + ")>([^<>/]*)</\\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 = "<(" + nodeName + ")>([^<>/]*)</\\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 = "<(" + nodeName + ")>([^<>/]*)</\\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<String> getNodeTextList(String xml, String nodeName) { List<String> list=new ArrayList<String>(); String regex = "<(" + nodeName + ")>([^<>/]*)</\\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 = "<SvcCont>(.+?)</SvcCont>"; Matcher m = Pattern.compile(regex, Pattern.DOTALL).matcher(xml); if (m.find()) { return m.group(1); } else { return null; } }
时间: 2024-10-12 04:29:46