`
huakewoniu
  • 浏览: 47801 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

java 正则表达式的使用及代码重构(优雅代码实现)案列

阅读更多

java 正则表达式的使用及代码重构(优雅代码实现)案列

实现功能 将 the first item is a hamer,with a cost of $132.99. 分解成单个的单词,数字,标点。

/**The following program  It tokenizes a string into its

 *  textual components: words, numbers,

 * or punctuation. Although it is a simple example, it illustrates

 * the basic techniques used to tokenize any type of input.

 */

 

 

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

/**

 * @author chenhao

 *

 */

/**

 * @author chenhao

 *

 */

public final class SimpleTextTokenizer {

    /**

     *

     */

    private SimpleTextTokenizer() { }

     /**

      *"\G"表示前一匹配的结尾 , "/z"表示字符串的结尾(包括)行终止符 end 用来匹配字符串的结尾.

      */

     private static Pattern end = Pattern.compile("//G//z");

 

     /**

     * "\g\w+" 表示从前一批匹配的结尾开始匹配一个或多个可以成为单词的的.

      * 一部分的字符. 如A - Z a-z 0 - 9 及下划线 (单词字符)

      */

     private static Pattern wrod = Pattern.compile("\\G\\w+");

 

     /**

      * . "/p{Punct}" 包含所有的标点符号

*/

private static Pattern punct = Pattern.compile("\\G\\p{Punct}");

/**

*"\s" 匹配空格.

*/

private static Pattern space = Pattern.compile("\\G\\s");

 

/**

* . 匹配数字

*/

private static Pattern number = Pattern.compile("\\G\\d+\\.?\\d*");

 

/**

* the method returns the next token

* retrieved from the Matcher passed to.

* @param mat

*            the Matcher of the text

* @return the next token of the text

*/

static String getTextToken(final Matcher mat) {

// First skip leading spaces

mat.usePattern(space);

mat.find();

// Next, obtain the next token in the string

// by attempting to match each pattern.

// The token found by the first matching pattern

// is returned. The order in which the patterns

// are tried matters. Checking for a word

// before checking for a number can change the results.

// First check for a number

mat.usePattern(number);

if (mat.find()) {

return mat.group();

}

// if not a number check for word

mat.usePattern(wrod);

if (mat.find()) {

return mat.group();

}

 

// check for punction

mat.usePattern(punct);

if (mat.find()) {

return mat.group();

}

 

// finall check for end of string

mat.usePattern(end);

if (mat.find()) {

return "";

}

 

// token is not recognized

return null; // invalid token

}

 

/**

* @param args

*/

public static void main(final String[] args) {

String token;

// Create a matcher

Matcher mat = end.matcher("the first item is a hamer,"

+ "with a cost of $132.99");

// display the tokens in the string

do {

token = getTextToken(mat);

if (token == null) {

System.out.println("invalid token");

break;

}

if (token.length() != 0) {

System.out.println("Token " + token);

} else {

System.out.println("End of String");

}

} while (token.length() != 0);

}

}

 

 

代码要写得优雅,但是上面这段代码很明显是不优雅的

1注释太多;

2方法不可重用

3有丑陋的条件判断句。

4可扩展性不强

 

改进方法

1利用好的命名来代替注释

2使用单一功能的方法

3利用多态,及好的设计模式来解决条件判断

综上可以写出很优雅的代码,可读性与可扩展性,可维护性都会大大提高

 

下面是代码实现

SimpleTextTokenizer.java

 

import java.util.LinkedList;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

/**The following program  It tokenizes a string into its

 *  textual components: words, numbers,

 * or punctuation. Although it is a simple example, it illustrates

 * the basic techniques used to tokenize any type of input.

 */

 

 

/**

 * @author chenhao

 *

 */

public final class SimpleTextTokenizer {

 

    /**

     *"\G"表示前一匹配的结尾 , "/z"表示字符串的结尾(包括)行终止符 end 用来匹配字符串的结尾.

     */

    private static Pattern end = Pattern.compile("\\G\\z");

 

    /**

     * "\g\w+" 表示从前一批匹配的结尾开始匹配一个或多个可以成为单词的的. 一部分的字符. 如A - Z a-z 0 - 9 及下划线

     * (单词字符)

     */

    private static Pattern word = Pattern.compile("\\G\\w+");

 

    /**

     * . "/p{Punct}" 包含所有的标点符号

     */

    private static Pattern punct = Pattern.compile("\\G\\p{Punct}");

    /**

     *"\s" 匹配空格.

     */

    private static Pattern space = Pattern.compile("\\G\\s");

 

    /**

     * . 匹配数字

     */

    private static Pattern number = Pattern.compile("\\G\\d+\\.?\\d*");

 

    private SimpleTextTokenizer() { }

    class InvalidToken implements TokenPrinter {

        /*

         * (non-Javadoc)

         * @see TokenPrinter#print()

         */

        public int print() {

            System.out.println("invalid token");

            return 0;

        }

    }

 

    class EndToken implements TokenPrinter {

 

        /* (non-Javadoc)

         * @see TokenPrinter#print()

         */

        public int print() {

            System.out.println("End of String");

            return 0;

        }

 

    }

 

    class NormalToken implements TokenPrinter {

        private String token;

 

        public NormalToken(final String token) {

            this.token = token;

        }

 

        /*

         * (non-Javadoc)

         * @see TokenPrinter#print()

         */

        public int print() {

            System.out.println("Token " + token);

            return 1;

        }

 

    }

 

    /**

     * the method returns the next token retrieved from the Matcher passed to.

     * @param mat

     *            the Matcher of the text

     * @return the next token of the text

     */

    static TokenPrinter getNextTokenMtchPattern(final Matcher mat) {

        skipLeadingSpaces(mat);

        return nextTokenMtchPattern(mat);

    }

 

    /**

     * @param mat

     *            the matcher of a string

     * @return the next token of the string

     */

    private static TokenPrinter nextTokenMtchPattern(final Matcher mat) {

        // Next, obtain the next token in the string

        // by attempting to match each pattern.

        // The token found by the first matching pattern

        // is returned. The order in which the patterns

        // are tried matters. Checking for a word

        // before checking for a number can change the results.

        // First check for a number

        LinkedList<Pattern> patternList = createPatternList();

        for (Pattern pat : patternList) {

            mat.usePattern(pat);

            if (mat.find()) {

                return  createTokenPrinter(mat.group());

            }

        }

        return createTokenPrinter(null); // the patternList is null;

    }

 

    /**

     * @return a linkedList of Pattern;

     */

    private static LinkedList<Pattern> createPatternList() {

        LinkedList<Pattern> patternList = new LinkedList<Pattern>();

 

        patternList.add(number);

        patternList.add(word);

        patternList.add(punct);

        patternList.add(end);

        return patternList;

    }

 

    /**

     * create a TokenPrinter use the token match the Pattern.

     * @param token the token match the Pattern

     * @return tokenPrinter

     */

    private static TokenPrinter createTokenPrinter(final String token) {

        SimpleTextTokenizer textTokenizer = new SimpleTextTokenizer();

        if (token == null) {

            return textTokenizer.new InvalidToken();

        }

        if (token.length() == 0) {

            return textTokenizer.new EndToken();

        } else {

            return textTokenizer.new NormalToken(token);

        }

 

    }

    /**

     * @param mat

     *            the matcher of a string. we won't let the mat point to anther

     *            object so it is final

     */

    private  static void displayTokensInString(final Matcher mat) {

        TokenPrinter tokenPtinter;

        do {

            tokenPtinter = getNextTokenMtchPattern(mat);

        } while (tokenPtinter.print() != 0);

    }

    /**

     * @param mat

     *            the matcher

     */

    private static void skipLeadingSpaces(final Matcher mat) {

        mat.usePattern(space);

        mat.find();

    }

 

    /**

     * @param args

     *  does nothing in this programs

     */

    public static void main(final String[] args) {

        // Create a matcher

        Matcher mat = end.matcher("the first item is a hamer,"

                + "with a cost of $132.99.");

        displayTokensInString(mat);

    }

}

 

TokenPrinter.java

/**

 * @author chenhao

 * print the token itself.

 */

interface TokenPrinter {

    /**

     * print the token itself.

     * @return the type of the token

     */

    int print();

}

 

分享到:
评论

相关推荐

    java正则表达式.zip

    在Java中,正则表达式主要通过`java.util.regex`包来实现,提供了Pattern和Matcher两个核心类。 **1. Pattern类** Pattern类是Java正则表达式的起点,它将一个正则表达式编译成一个模式对象。这个编译过程可以优化...

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

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

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

    Java使用正则表达式提取XML节点内容的方法示例主要介绍了Java使用正则表达式提取XML节点内容的方法,结合具体实例形式分析了java针对xml格式字符串的正则匹配相关操作技巧。 一、正则表达式简介 正则表达式是指一...

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

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

    常用java正则表达式

    在Java中使用正则表达式,通常会使用Java自带的标准库。但在撰写本文时,Java尚未正式支持正则表达式,因此可以通过Jakarta-ORO库来实现。以下是一个简单的使用示例: 1. **加载Jakarta-ORO库**:首先,从Apache...

    java正则表达式验证

    java使用正则表达式进行校验验证,主要使用了Pattern和Matcher类,直接main方法运行就可以,亲测有效

    JAVA正则表达式大全

    提供的“例子”可能包含了各种实际的Java代码示例,演示了如何在实际编程中应用正则表达式,比如验证用户输入的邮箱格式、电话号码格式等。 正则表达式的学习需要对元字符、量词、预查、后向引用等概念有深入理解...

    java正则表达式匹配工具

    在Java中,正则表达式的使用主要依赖于`java.util.regex`包中的类,如`Pattern`和`Matcher`。 首先,我们来看`Pattern`类。这个类是正则表达式的模板,负责编译和存储正则表达式。一旦正则表达式被编译为`Pattern`...

    Java正则表达式.ppt

    使用Java正则表达式的好处在于它能显著提高编程效率,例如验证电子邮件地址这样的任务,传统方法可能需要大量的代码,而使用正则表达式则可以大大简化。然而,这也需要程序员学习和掌握正则表达式相关的知识。 在...

    java正则表达式验证IP地址

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

    使用Java正则表达式实现一个简单的身份证号码验证

    ### 使用Java正则表达式实现一个简单的身份证号码验证 #### 一、背景介绍 身份证号码是中国公民的身份标识,由15位或18位数字组成(早期为15位,后改为18位)。其中,第18位是校验码,可能是数字0~9或者大写字母X。...

    java 字符串 正则表达式 详细实例代码

    本篇将深入探讨Java中的字符串、正则表达式及其在实际编程中的详细实例代码。 1. **字符串基础** - Java中的字符串是不可变的,这意味着一旦创建了字符串对象,就不能更改其内容。这由`final`关键字确保,提高了...

    java正则表达式使用例子

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

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

    在Java中,正则表达式是通过java.util.regex包提供的接口和类来实现的。`regex-smart.jar`这个库显然是为了简化开发者在Java项目中使用正则表达式的流程,它提供了一系列内置的验证、提取和清洗方法,使得处理字符串...

    Java正则表达式入门介绍.ppt

    Java正则表达式的优点在于能够用较少的代码完成复杂的文本匹配任务,但这也需要开发者熟悉其语法。 正则表达式的基础知识包括以下几个关键概念: 1. 句点符号(`.`):句点代表任意单个字符,如果想匹配任意三个...

    Java 正则表达式 图片版

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

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

    这个示例代码使用了Java正则表达式来验证邮箱的格式是否正确。 Java正则表达式的常用语法 以下是一些常用的Java正则表达式语法: 1. `.`:匹配任何字符。 2. `*`:匹配零个或多个字符。 3. `+`:匹配一个或多个...

    常用正则表达式HTML,JAVA合集

    这个合集提供的HTML和Java正则表达式实例,为开发者提供了一个快速参考的工具,帮助他们在开发过程中快速有效地实现数据验证功能。理解并熟练运用这些正则表达式,对于提高代码质量和用户体验都有极大的帮助。在实际...

    Java正则表达式应用总结

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

    Java正则表达式介绍和练习

    Java正则表达式介绍和练习Java正则表达式介绍和练习Java正则表达式介绍和练习

Global site tag (gtag.js) - Google Analytics