`
yjhexy
  • 浏览: 331139 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

JAVA 正则表达式初探

阅读更多

一直听说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正则表达式.zip

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它基于模式匹配的概念,能够高效地进行文本搜索、替换和解析。在Java中,正则表达式主要通过`java.util.regex`包来实现,提供了Pattern和Matcher两个核心...

    Java使用正则表达式提取XML节点内容的方法示例

    为了帮助开发者更好地掌握Java正则表达式技术,我们提供了一系列的Java正则表达式技巧大全,包括《Java正则表达式技巧大全》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧...

    java正则表达式验证IP地址

    Java正则表达式验证IP地址 Java正则表达式验证IP地址是指使用Java语言中的正则表达式来验证IP地址是否符合标准。IP地址是指在网络通信中用来标识设备的地址,它是一种逻辑地址,通过它可以找到网络中的设备。在...

    java正则表达式匹配工具

    Java正则表达式匹配工具是IT领域中一种强大的文本处理工具,它利用正则表达式(Regular Expression)的规则来查找、替换或者提取文本中的特定模式。正则表达式是一种特殊的字符序列,能够帮助程序员或者用户高效地...

    JAVA正则表达式大全

    在Java编程语言中,正则表达式被广泛应用于数据验证、文本提取和字符串操作。以下是对这些文档标题所涉及的Java正则表达式知识点的详细解释: 1. **正则表达式之道** 这个主题可能涵盖了正则表达式的基础概念,...

    Java正则表达式.ppt

    Java正则表达式是一种强大的文本处理工具,广泛用于验证字符串、查找特定模式和替换文本。在Java中,正则表达式提供了简洁而灵活的方式来处理字符串,使得编程人员能够以更高效的方式实现各种文本操作。 正则表达式...

    使用Java正则表达式分析处理日志

    本篇将围绕“使用Java正则表达式分析处理日志”这一主题,探讨如何利用Java的正则表达式功能来提取、过滤和操作日志数据。 首先,我们需要理解正则表达式的基本概念。正则表达式(Regular Expression)是一种模式...

    Java正则表达式 Java 正则表达式

    Java正则表达式是Java语言中用于处理字符串的强大工具,它允许程序员进行复杂的字符串匹配、查找和替换操作。正则表达式(Regular Expression)是一种模式匹配语言,通过特定的语法来描述字符串的模式,用于在文本中...

    java 正则表达式应用jar包 regex-smart.jar

    Java正则表达式是编程语言Java中的一个强大工具,它用于模式匹配、数据验证和文本检索替换。在Java中,正则表达式是通过java.util.regex包提供的接口和类来实现的。`regex-smart.jar`这个库显然是为了简化开发者在...

    Java 正则表达式 图片版

    Java正则表达式 Java 正则表达式 图片版 携带方便,查阅方便!~

    Java正则表达式测试工具

    Java正则表达式测试工具是面向开发者和爱好者的一款实用程序,它可以帮助用户验证和调试他们的正则表达式。在Java编程环境中,正则表达式是一个强大的字符串处理工具,广泛用于数据验证、文本搜索和替换等任务。这款...

    Java 正则表达式库

    Java正则表达式库是Java开发中不可或缺的一部分,它为开发者提供了一种强大的文本匹配工具。在Java中,正则表达式(Regular Expression)是一种模式匹配语言,用于处理字符串操作,如查找、替换或提取特定模式的数据...

    Java正则表达式应用总结

    Java正则表达式是编程语言Java中用于处理字符串和文本的强大工具。它允许开发者通过模式匹配来执行复杂的文本分析和操作。在Java中,正则表达式的操作主要涉及两个核心类:`java.util.regex.Matcher`和`java.util....

    Java正则表达式详细讲解

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许程序员通过模式匹配来查找、替换或分割文本。在Java中,正则表达式是通过`java.util.regex`包提供的API来实现的。本讲解将深入探讨Java正则表达式的...

    java正则表达式使用例子

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许我们通过模式匹配来查找、替换或分割文本。在Android开发中,正则表达式尤其重要,因为它们可以帮助我们验证用户输入、处理文本数据或者进行复杂的...

    Java正则表达式_动力节点Java学院整理

    Java正则表达式详解 Java正则表达式是Java语言中的一种模式匹配技术,用于匹配、查找、替换和判断字符串。它是一种强大的工具,能够帮助开发者快速处理字符串相关的任务。 什么是正则表达式? 正则表达式是一种...

    Java正则表达式详解(非常适合入门

    ### Java正则表达式详解 #### 一、正则表达式的重要性及应用 正则表达式,作为一种强大的文本处理工具,对于程序员而言是不可或缺的基本技能之一。它在文本的匹配、搜索和替换等方面发挥着不可替代的作用。尤其在...

    JAVA正则表达式的应用

    JAVA正则表达式应用:任意输入一串字符串 如何输入exit退出程序;从输入的字符串中判断是否包含手机号码 正则表达式可以使用&quot; +86| 86 1 d{10}&quot; 如果包含请将其在控制台打印出来 否则输出不包含字符串 ...

    java正则表达式匹配全角空格

    ### Java正则表达式匹配全角空格 在Java编程中,处理字符串是非常常见的需求之一。其中,使用正则表达式来对字符串进行拆分、替换等操作是一种非常高效的方法。本文将详细介绍如何使用Java中的`split()`方法,并...

Global site tag (gtag.js) - Google Analytics