Регулярное выражение для поиска двух слов в строке - PullRequest
2 голосов
/ 14 февраля 2012

Вот моя основная проблема: я читаю некоторые строки из файла. Формат каждой строки в файле следующий:

John Doe    123

Существует вкладка между Doe и 123.

Я ищу такое регулярное выражение, чтобы я мог "снять" John Doe. Что-то вроде scanner.next(regular expression), которое дало бы мне John Doe.

Это, наверное, очень просто, но я не могу заставить его работать. Кроме того, я пытаюсь понять это, не полагаясь на находящуюся там вкладку.

Я посмотрел здесь: Регулярное выражение регулярного выражения для проверки ввода: два слова с пробелом между . Но ни один из этих ответов не сработал. Я продолжал получать ошибки во время выполнения.

Код:

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 ]

2 голосов
/ 14 февраля 2012

Требуется ли для этого использовать регулярное выражение? Вы можете просто использовать split метод через \t в каждой строке и просто взять первый или второй элемент (я не уверен, что вы имели в виду под «отрывом» Джона Доу).

0 голосов
/ 14 февраля 2012

Вы предпочитаете простоту и удобочитаемость?Если это так, рассмотрите следующее решение

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");

    }

}
0 голосов
/ 14 февраля 2012

Это в основном работает, чтобы изолировать Джона Доу от остальных ...

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;
}

Скобка для группировки позволит вам «выделить» часть имени из части цифры. "Джон Доу", "Джейн Остин", что угодно. Вы должны изучить группировку в RegEx, так как она отлично подходит для подобных задач.

Хитрость для удаления лишних пробелов взята из Как удалить дублирующиеся пробелы в строке с помощью Java?

0 голосов
/ 14 февраля 2012

Было бы полезно, если бы вы предоставили код, который вы пытаетесь вызвать ошибки во время выполнения.

Вы можете использовать регулярное выражение:

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

, если вы всегда знали, что ваше имя идетбыть двумя словами.

Вы также можете попробовать

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

, который соответствует любому количеству слов (содержащих алфавиты), убедившись, что он захватывает целые слова (это то, что '\ b') -> вернуть «Джон Доу» вместо «Джон Доу» (с пробелом тоже).Не забывайте, что в Java нужно экранировать обратную косую черту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...