一直听说apache 有个oro的正则表达式比JAVA的好,于是稍仔细的研究了一番:
写了些许个很简单的代码:
package com.yajun;
import java.util.ArrayList;
import java.util.List;
import org.apache.oro.text.regex.MalformedPatternException;
import org.apache.oro.text.regex.Pattern;
import org.apache.oro.text.regex.PatternCompiler;
import org.apache.oro.text.regex.PatternMatcher;
import org.apache.oro.text.regex.PatternMatcherInput;
import org.apache.oro.text.regex.Perl5Compiler;
import org.apache.oro.text.regex.Perl5Matcher;
import org.apache.oro.text.regex.Perl5Substitution;
import org.apache.oro.text.regex.Util;
/**
* 正则表达式匹配
*
* @author yajun.wuyj 2009-11-15 下午07:55:34
*/
public class MyPerlMatchUtil {
private Pattern pattern;
public MyPerlMatchUtil(String patternString) {
PatternCompiler compiler = new Perl5Compiler();
try {
this.pattern = compiler.compile(patternString);
} catch (MalformedPatternException e) {
System.err.println("正则表达式出错 ");
throw new RuntimeException(e);
}
}
/**
* 判断是否匹配
*
* @param inputString
* @param patternString
* @return
*/
public boolean match(String inputString, String patternString) {
return new Perl5Matcher().matches(inputString, pattern);
}
/**
* 以组返回所有的匹配的关键词
*
* @param inputString
* @param patternString
* @return
*/
public List<String> getMatchedKey(String inputString, String patternString) {
List<String> groupList = new ArrayList<String>();
Perl5Matcher matcher = new Perl5Matcher();
if (matcher.matches(inputString, pattern)) {
int groupNum = matcher.getMatch().groups();
for (int i = 0; i < groupNum; i++) {
groupList.add(matcher.getMatch().group(i));
}
}
return groupList;
}
/**
* 判断是否含有
*
* @param inputString
* @param patternString
* @return
*/
public boolean contains(String inputString, String patternString) {
return new Perl5Matcher().contains(inputString, pattern);
}
/**
* 可以继续匹配下一个(最大匹配原则的继续匹配下一个)
*
* @param inputString
* @param patternString
* @return
*/
public boolean nextContains(String inputString, String patternString) {
Perl5Matcher matcher = new Perl5Matcher();
PatternMatcherInput input = new PatternMatcherInput(inputString);
// while (matcher.contains(input, getPattern(patternString))) {
// MatchResult result = matcher.getMatch();
// System.out.println(result.group(0) + ":" + inputString);
// }
return matcher.contains(input, pattern);
}
/**
* 文本替换操作
*
* @param sourceString
* @param patternString
* @param desString
* @return
*/
public String replace(String sourceString, String patternString,
String desString) {
try {
PatternMatcher matcher = new Perl5Matcher();
Perl5Substitution repalcer = new Perl5Substitution(desString,
Util.SUBSTITUTE_ALL);
return Util.substitute(matcher, pattern, repalcer, sourceString,
Util.SUBSTITUTE_ALL);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
写完之后发现oro 本身提供了上述类似功能的工具类,而且比我这个功能肯定更完善和强大,比方说他的工具会对常用的compile进行LRU算法的缓存。吐血白写了。。
使用他提供的类写了如下简单的代码:
package com.yajun;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import org.apache.oro.text.perl.Perl5Util;
/**
* 使用Perl5Util的工具,感觉运行速度慢些
*
* @author yajun.wuyj
*/
public class Perl5MatcherTester {
public void match(String line, String pattern) {
Perl5Util util = new Perl5Util();
if (util.match(pattern, line)) {
System.out.println(line);
System.out.println(util.substitute("s/美女/{我爱美女}/g", line));
}
}
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
FileReader fr = new FileReader(new File(
"E:/work/balanceofworld/balance/balance.textparser/meinv.txt"));
BufferedReader br = new BufferedReader(fr);
String line = null;
while ((line = br.readLine()) != null) {
Perl5MatcherTester test = new Perl5MatcherTester();
test.match(line, "/美女/");
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
代码一下变得少了很多。
也做了一下比较,可能是我用了小文本,短的正则表达式去比较,没有比较出明显性能效果来吧。
既然使用了,不妨也看看他怎么实现的,于是进入网站:
于是 svn co http://svn.apache.org/repos/asf/jakarta/oro/trunk/ oro
下了代码下来一看,汗一个,贴出来看下:
/*
* $Id: JavaCompiler.java 124053 2005-01-04 01:24:35Z dfs $
*
* Copyright 2000-2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.oro.text.java;
import java.util.regex.*;
import org.apache.oro.text.regex.*;
/**
*
* @version @version@
* @since 2.1
*/
public final class JavaCompiler implements PatternCompiler {
public org.apache.oro.text.regex.Pattern compile(String pattern)
throws MalformedPatternException
{
return compile(pattern, 0);
}
public org.apache.oro.text.regex.Pattern compile(String pattern, int options)
throws MalformedPatternException
{
try {
JavaPattern jp = new JavaPattern(pattern);
return jp;
} catch(Exception e) {
// We can't wrap the exception without making MalformedPatternException
// dependent on J2SE 1.4.
throw new MalformedPatternException(e.getMessage());
}
}
public org.apache.oro.text.regex.Pattern compile(char[] pattern)
throws MalformedPatternException
{
return compile(new String(pattern));
}
public org.apache.oro.text.regex.Pattern compile(char[] pattern, int options)
throws MalformedPatternException
{
return compile(new String(pattern));
}
}
看了以上代码发现还是用的SUN的,所以本质上应该不会有太大的性能或者BUG问题。
不过他提供的工具类的确蛮好。至少可以少写很多代码。
这个类库还提供了awk的功能,总体来说还是不错的,推荐使用啦。
分享到:
相关推荐
Java正则表达式是Java编程语言中用于处理字符串的强大工具,它基于模式匹配的概念,能够高效地进行文本搜索、替换和解析。在Java中,正则表达式主要通过`java.util.regex`包来实现,提供了Pattern和Matcher两个核心...
为了帮助开发者更好地掌握Java正则表达式技术,我们提供了一系列的Java正则表达式技巧大全,包括《Java正则表达式技巧大全》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧...
Java正则表达式验证IP地址 Java正则表达式验证IP地址是指使用Java语言中的正则表达式来验证IP地址是否符合标准。IP地址是指在网络通信中用来标识设备的地址,它是一种逻辑地址,通过它可以找到网络中的设备。在...
Java正则表达式匹配工具是IT领域中一种强大的文本处理工具,它利用正则表达式(Regular Expression)的规则来查找、替换或者提取文本中的特定模式。正则表达式是一种特殊的字符序列,能够帮助程序员或者用户高效地...
在Java编程语言中,正则表达式被广泛应用于数据验证、文本提取和字符串操作。以下是对这些文档标题所涉及的Java正则表达式知识点的详细解释: 1. **正则表达式之道** 这个主题可能涵盖了正则表达式的基础概念,...
Java正则表达式是一种强大的文本处理工具,广泛用于验证字符串、查找特定模式和替换文本。在Java中,正则表达式提供了简洁而灵活的方式来处理字符串,使得编程人员能够以更高效的方式实现各种文本操作。 正则表达式...
本篇将围绕“使用Java正则表达式分析处理日志”这一主题,探讨如何利用Java的正则表达式功能来提取、过滤和操作日志数据。 首先,我们需要理解正则表达式的基本概念。正则表达式(Regular Expression)是一种模式...
Java正则表达式是Java语言中用于处理字符串的强大工具,它允许程序员进行复杂的字符串匹配、查找和替换操作。正则表达式(Regular Expression)是一种模式匹配语言,通过特定的语法来描述字符串的模式,用于在文本中...
Java正则表达式是编程语言Java中的一个强大工具,它用于模式匹配、数据验证和文本检索替换。在Java中,正则表达式是通过java.util.regex包提供的接口和类来实现的。`regex-smart.jar`这个库显然是为了简化开发者在...
Java正则表达式 Java 正则表达式 图片版 携带方便,查阅方便!~
Java正则表达式测试工具是面向开发者和爱好者的一款实用程序,它可以帮助用户验证和调试他们的正则表达式。在Java编程环境中,正则表达式是一个强大的字符串处理工具,广泛用于数据验证、文本搜索和替换等任务。这款...
Java正则表达式库是Java开发中不可或缺的一部分,它为开发者提供了一种强大的文本匹配工具。在Java中,正则表达式(Regular Expression)是一种模式匹配语言,用于处理字符串操作,如查找、替换或提取特定模式的数据...
Java正则表达式是编程语言Java中用于处理字符串和文本的强大工具。它允许开发者通过模式匹配来执行复杂的文本分析和操作。在Java中,正则表达式的操作主要涉及两个核心类:`java.util.regex.Matcher`和`java.util....
Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许程序员通过模式匹配来查找、替换或分割文本。在Java中,正则表达式是通过`java.util.regex`包提供的API来实现的。本讲解将深入探讨Java正则表达式的...
Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许我们通过模式匹配来查找、替换或分割文本。在Android开发中,正则表达式尤其重要,因为它们可以帮助我们验证用户输入、处理文本数据或者进行复杂的...
Java正则表达式详解 Java正则表达式是Java语言中的一种模式匹配技术,用于匹配、查找、替换和判断字符串。它是一种强大的工具,能够帮助开发者快速处理字符串相关的任务。 什么是正则表达式? 正则表达式是一种...
### Java正则表达式详解 #### 一、正则表达式的重要性及应用 正则表达式,作为一种强大的文本处理工具,对于程序员而言是不可或缺的基本技能之一。它在文本的匹配、搜索和替换等方面发挥着不可替代的作用。尤其在...
JAVA正则表达式应用:任意输入一串字符串 如何输入exit退出程序;从输入的字符串中判断是否包含手机号码 正则表达式可以使用" +86| 86 1 d{10}" 如果包含请将其在控制台打印出来 否则输出不包含字符串 ...
### Java正则表达式匹配全角空格 在Java编程中,处理字符串是非常常见的需求之一。其中,使用正则表达式来对字符串进行拆分、替换等操作是一种非常高效的方法。本文将详细介绍如何使用Java中的`split()`方法,并...