【问题标题】:Regular expression to retrieve words from files从文件中检索单词的正则表达式
【发布时间】:2012-04-13 19:19:11
【问题描述】:

我有一组文件,特别是目录。

从目录中的所有文件(文本文件)中检索内容后,我有一个 字符串列表。

每个字符串元素代表从每个文件中检索到的内容。所以列表中的第一个 String 元素代表第一个文件的内容。

现在我想拆分字符串来获取单词。(稍后将单词存储到字符串数组中) 1)单词可以用单个空格/多个空格分隔。 2) 句子以“.”结尾,所以可以在“.”之后开始一个新词。 3) '\n' 之后可以开始一个新词

那么任何人都可以建议一个适合 split() 方法的正则表达式吗?

【问题讨论】:

标签: java split


【解决方案1】:

也许StringTokenizer 类更适合您的需要。构造函数采用要标记的字符串和分隔符列表(在您的情况下:空格、. 和换行符)。

【讨论】:

  • 根据StringTokenizerjavadocs:StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.
【解决方案2】:
String[] result = myString.split("[\\.\\s]");

【讨论】:

    【解决方案3】:

    您可能不需要正则表达式,只需从文件中删除每个非字母字符,然后使用 Tokenizer 读取每个单词。

    【讨论】:

    • - 是一个非字母字符。好像不应该删。此外,如果您删除所有非字母字符,您最终会得到一个非常长的单词。
    • 我将文件内容检索为字符串列表,其中每个元素代表单个文件内容。现在如果我在 split() 方法中使用分隔符,我应该用什么代替分隔符?
    • @John B ,Wojtek 可能是告诉通过检测非字母字符来跟踪单词..
    • 显然您不必删除空格,但这是我解决此问题的一般想法。
    【解决方案4】:

    我建议为此使用标记...只需遍历每个字符并根据字符是什么来决定要做什么。这是伪代码

    string word = "";
    
    while ( EOF ){
    
        char = getNextChar()
    
        if ( char not space or full-stop ){
            append the char to the word
        }
        else {
            if ( the word is empty ){ continue /* ignore multi space */ }
            else {
                add the word to an array of words
                reset the word to ""
            }
        }
    }
    

    这样,您可以完全控制处理数据的方式 - 您不必担心包含在正则表达式规则中的疯狂场景。最重要的是,这是最有效的方式(def 比 regex 更好),而且您只需遍历数据一次。

    【讨论】:

    • 已经有很多工具可以做到这一点。我不鼓励重新发明轮子。
    猜你喜欢
    • 2014-04-27
    • 2017-11-27
    • 2020-01-25
    • 2012-03-10
    • 1970-01-01
    • 2011-10-13
    • 2019-09-07
    • 1970-01-01
    • 2017-10-01
    相关资源
    最近更新 更多