Регулярное выражение для поиска списка чисел в предложении - PullRequest
0 голосов
/ 15 сентября 2011

У меня есть предложение как таковое:

"Список предметов 1, 2 и 5, содержащих бла-бла-бла."

Что также может быть что-то вроде:

«Согласно пунктам со 2 по 11 будет бла-бла».

Есть ли простое регулярное выражение, чтобы получить эти числа? Кроме того, мне нужно знать, было ли это «1 и 5» или «1 - 5», чтобы я мог заполнить другие цифры, если это необходимо.

Ответы [ 4 ]

1 голос
/ 16 сентября 2011

Вы можете использовать шаблон регулярного выражения (?i)(\\d+)(?:(?:(?:\\s*)(,|and|through)(?:\\s*))|.*$).Следующий пример кода:

final String ps = "(?i)(\\d+)(?:(?:(?:\\s*)(,|and|through)(?:\\s*))|.*$)";
final Pattern p = Pattern.compile(ps);
for (String s : new String[] {
        "A list of items 1, 2 and 5 containing blah blah blah.",
        "According to items 2 THROUGH 11 there will be blah blah."})
{
    System.out.println("***** TEST STRING *****\n" + s + "\n");
    final Matcher m = p.matcher(s);
    int cnt = 0;
    while (m.find()) {
        System.out.println(++cnt + ": G1: " + m.group(1) + " G2: "
                + m.group(2));
    }
    System.out.println("");
}

Будет выводить:

***** TEST STRING *****
A list of items 1, 2 and 5 containing blah blah blah.

1: G1: 1 G2: ,
2: G1: 2 G2: and
3: G1: 5 G2: null

***** TEST STRING *****
According to items 2 THROUGH 11 there will be blah blah.

1: G1: 2 G2: THROUGH
2: G1: 11 G2: null

Вы можете использовать группу 1 для получения номера и группу 2, чтобы определить, каким будет ваш следующий шаг: ,и and для включения следующего числа в ваш список, through для включения диапазона и null, когда больше нет чисел.

0 голосов
/ 15 сентября 2011

Если вы просто хотите найти все цифры в строке

public List<String> findDigits(String s) {
    String regex = "\\d+";
    Matcher m = Pattern.compile(regex).matcher(s);
    List<String> digits = new ArrayList<String>();
    while (m.find()) {
        digits.add(s.substring(m.start(), m.end()));
    }
    return digits;
}
0 голосов
/ 15 сентября 2011

Это будет делать: (\b\d+\s+through\s+\d+)|(\b\d+\s+and\s+\d+)|(\b\d+\b)

Обратите внимание, что \s будет соответствовать [ \t\n\x0B\f\r]

0 голосов
/ 15 сентября 2011

Вы можете легко извлечь все числа из строки, используя шаблон, такой как "\ d +", но для фраз, таких как "1 - 5", вам нужно гораздо более четкое определение того, что вы хотите анализировать.

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