用于在字符串中查找两个单词的正则表达式

时间:2012-02-14 05:37:14

标签: java regex

这是我的基本问题:我正在从文件中读取一些行。文件中每一行的格式为:

John Doe    123

Doe123之间有一个标签。

我正在寻找一个正则表达式,以便我可以“挑选”John Doe。类似scanner.next(regular expression)的内容会给我John Doe

这可能很简单,但我似乎无法让它发挥作用。此外,我试图弄清楚这一点,而不必依赖于那里的标签。

我看过这里:Regular Expression regex to validate input: Two words with a space between。但这些答案都没有奏效。我不断收到运行时错误。

一些代码:

while(inFile.hasNextLine()){
    String s = inFile.nextLine();
    Scanner string = new Scanner(s);
    System.out.println(s); // check to make sure I got the string
    System.out.println(string.next("[A-Za-z]+ [A-Za-z]+")); //This  
                                                //doesn't work for me
    System.out.println(string.next("\\b[A-Za-z ]+\\b"));//Nor does
                                                               //this
 }

4 个答案:

答案 0 :(得分:2)

你需要使用正则表达式吗?你可以简单地在每一行split上使用\t方法,只需抓住第一个或第二个元素(我不确定你选择'关闭'john doe的意思)。

答案 1 :(得分:0)

如果您提供的代码正在为您提供运行时错误,那将会有所帮助。

您可以使用正则表达式:

[A-Za-z]+ [A-Za-z]+

如果你总是知道你的名字会是两个字。

您也可以尝试

\b[A-Za-z ]+\b

匹配任意数量的单词(包含字母),确保它捕获整个单词(这就是'\ b') - >返回“John Doe”而不是“John Doe”(也有尾随空格)。不要忘记需要在Java中转义反斜杠。

答案 2 :(得分:0)

这基本上可以将John Doe与其他人隔离开来......

public String isolateAndTrim( String candidate ) {
    // This pattern isolates "John Doe" as a group...
    Pattern pattern = Pattern.compile( "(\\w+\\s+\\w+)\\s+\\d*" );
    Matcher matcher = pattern.matcher( candidate );
    String clean = "";
    if ( matcher.matches() ) {
        clean = matcher.group( 1 );
        // This replace all reduces away extraneous whitespace...
        clean = clean.replaceAll( "\\s+", " " );
    }
    return clean;
}

分组括号将允许您从数字部分“挑选”名称部分。 “John Doe”,“Jane Austin”,无论如何。您应该在RegEx中学习分组内容,因为它对于像这样的问题非常有用。

删除额外空格的技巧来自How to remove duplicate white spaces in string using Java?

答案 3 :(得分:0)

您更喜欢简单性和可读性吗?如果是,请考虑以下解决方案

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class MyLineScanner
{

    public static void readLine(String source_file) throws FileNotFoundException
    {
        File source = new File(source_file);
        Scanner line_scanner = new Scanner(source);

        while(line_scanner.hasNextLine())
        {
            String line = line_scanner.nextLine();

            // check to make sure line is exists;
            System.out.println(line); 

            // this work for me             
            Scanner words_scanner = new Scanner(line);
            words_scanner.useDelimiter("\t");           

            while (words_scanner.hasNext())
            {
                System.out.format("word : %s %n", words_scanner.next());
            }
        }

    }



    public static void main(String[] args) throws FileNotFoundException
    {
        readLine("source.txt");

    }

}