Какой самый простой способ удалить посторонние лидирующие числа? - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть данные, которые надежно в этом формате:

    1. New York Times - USA
    2. Guardian - UK
    3. Le Monde - France

Я использую этот код для анализа значений newspaper и country:

    String newspaper = "";
    String country = "";
    int hyphenIndex = unparsedText.indexOf("-");
    if (hyphenIndex > -1)
    {
        newspaper = unparsedText.substring(0, hyphenIndex);
    }
    country = unparsedText.substring(hyphenIndex + 1, unparsedText.length());
    country = country.trim();

Но это приводит к газетным ценностям:

    1. New York Times
    2. Guardian
    3. Le Monde

Какое самое простое изменение, чтобы получить газетные значения:

    New York Times
    Guardian
    Le Monde

Ответы [ 8 ]

4 голосов
/ 11 ноября 2010

Вот решение на основе регулярных выражений:

input.replaceAll("(?m)^\\d+\\.\\s*|\\s*-\\s*.*?$", "");

Регулярное выражение работает в многострочном режиме (?m) и удаляет:

  • Начальная цифра (цифры), за которой следует точка, за которой следует точкана любое число пробелов.
  • Дефис, за которым следует что-либо.

Я предполагаю, что в названии газеты нет дефисов.

Код в действии

2 голосов
/ 11 ноября 2010

Конечно, просто найдите индекс первого '.'и используйте substring(from,to), чтобы получить бит посередине.

Что-то вроде:

String newspaper = "";
String country = "";
int hyphenIndex = unparsedText.indexOf("-");
int dotIndex = unparsedText.indexOf(".");
if (hyphenIndex > -1)
{
    newspaper = unparsedText.substring(dotIndex + 1, hyphenIndex);
}
country = unparsedText.substring(hyphenIndex + 1, unparsedText.length());
country = country.trim();
1 голос
/ 11 ноября 2010

Я бы сделал это так:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Application
{
    public static void main ( final String[] args )
    {
        final String[] lines = new String[] { "1. New York Times - USA", "2. Guardian - UK", "3. Le Monde - France" };

        final Pattern p = Pattern.compile ( "\\.\\s+(.*?)\\s+-\\s+(.*)" );

        for ( final String unparsedText : lines )
        {
            String newspaper;
            String country;

            final Matcher m = p.matcher ( unparsedText );

            if ( m.find () )
            {
                newspaper = m.group ( 1 );
                country = m.group ( 2 );

                System.out.println ( "Newspaper: " + newspaper + " Country: " + country );
            }
        }
    }
}
1 голос
/ 11 ноября 2010

Это регулярное выражение должно работать:

    Pattern pattern =  Pattern.compile("\\d+.\\s(.*)\\s-.*");
    Matcher matcher = pattern.matcher("1. New Your Times - USA");
    String newspaper = matcher.toMatchResult().group(1);
    Assert.assertEquals("New Your Times", newspaper);
1 голос
/ 11 ноября 2010

String # split (строковое регулярное выражение) будет работать, если вы разделите на . и -.

[0] => "1"
[1] => " New York Times "
[2] => " USA"

Затем просто обрежьте нужные результаты.

1 голос
/ 11 ноября 2010
java.util.regex.Matcher m = (new java.util.regex.Pattern("[a-zA-Z ]*")).matcher(unparsedText);
m.find();
System.err.println(unparsedText.substring(m.start(), m.end());

Примечание # 1: при условии, что газета не может содержать цифры.

Примечание # 2: не проверял.

1 голос
/ 11 ноября 2010

Если все записи соответствуют формату, который вы указали, вы можете найти точку остановки после числа, например,

int dotIndex = unparsedText.indexOf(".");

, а затем

newspaper = unparsedText.substring(dotIndex + 2, hyphenIndex - 1);

Примечание: вы хотите начать 2 символа после . и исключить 1 пробел перед - или использовать trim()

1 голос
/ 11 ноября 2010

Если это действительно надежно в этом формате, кажется, что самый простой (и, вероятно, наиболее эффективный) способ сделать это - найти первый экземпляр символа ., а затем принятьподстрока, начинающаяся с dotIndex + 1.Фактически вы могли бы объединить это с вашей текущей операцией подстроки (в зависимости от положения тире), чтобы извлечь название газеты за один раз.

Если формат немного менее надежен, вы можете использовать регулярное выражение длясопоставьте цифры, за которыми следует символ-разделитель, затем пробел и удалите его.Но в этом случае это кажется излишним.

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