Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Выбрать из строки все числа, кроме 0 и 1  [new]
Molasar
Member

Откуда:
Сообщений: 461
Всем привет!

Как настроить NUM_PARSER, чтобы выводились все числа, кроме 0 и 1?
final String NUM_PARSER = "\\d+\\.*,*\\d*";
final String numString = " 1778.89 0 45 987,45 1 ";

Pattern patternNum = Pattern.compile(NUM_PARSER);
Matcher matcherNum = patternNum.matcher(numString);

while (matcherNum.find()) {
    System.out.println(matcherNum.group());
}

Выводит:
1778.89
0
45
987,45
1

Нужно:
1778.89
45
987,45
6 дек 18, 14:22    [21755829]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4360
Molasar, я извиняюсь, что не помогу вас, но у меня есть универсальный ответ на все подобные вопросы - не использовать рег выражения.
6 дек 18, 14:26    [21755836]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
msLex
Member

Откуда:
Сообщений: 5676
Molasar,

А что делать с числами

001
1,00
1.00
01.00

?


Кстати, символ "," и "." - это только разделители целой и дробной части или какой-то (а то и оба) могут использоваться как разделители групп разрядов (100,000,000)?
6 дек 18, 19:59    [21756329]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14817
Озверин
Molasar, я извиняюсь, что не помогу вас, но у меня есть универсальный ответ на все подобные вопросы - не использовать рег выражения.
ну зачем так категорично?

https://regex101.com/r/uwH1WY/2

https://regex101.com/r/uwH1WY/2/codegen?language=java

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

final String regex = "(?(?=\\s[1|0]\\s)\\s[0|1]\\s|(\\d+[,|.]\\d+|\\d+))";
final String string = " 1778.89 0 45 987,45 1 5 6 1 ";

final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}
6 дек 18, 21:21    [21756421]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
Пылинка
Member

Откуда: СПб
Сообщений: 256
вадя,

А так если
final String string = " 1778.89 0 1 45 987,45 1 5 6 1 ";

Но вот так будет работать
final String string = " 1778.89 0  1 45 987,45 1 5 6 1 ";
6 дек 18, 22:53    [21756477]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14817
Пылинка,

https://regex101.com/r/uwH1WY/3

final String regex = "(?(?=\\s[10]\\s|[01]\\s)\\s[01]\\s|(\\d+[,.]\\d+|\\d+))";
7 дек 18, 08:14    [21756596]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4360
вадя
Пылинка,

https://regex101.com/r/uwH1WY/3

final String regex = "(?(?=\\s[10]\\s|[01]\\s)\\s[01]\\s|(\\d+[,.]\\d+|\\d+))";


это же непонятная хрень!)) Как в этом разобраться?
никогда не понимал людей, которые используют в яве это.
Рег выражения можно юзать только там, где точно знаешь, что выражения - на года и меняться не будет. А так оно будет только расти и захватывать мозг человека. Не проще ли в цикле перебрать все и отсеять ненужное? Стримы уже придумали, можно
stream().filter().collect() использовать, если уже совсем не по нраву for()
7 дек 18, 08:37    [21756609]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14817
Озверин
это же непонятная хрень!)) Как в этом разобраться?
как ни странно - достаточно просто.
тем более что есть шикарный инструмент для пробы и обучения https://regex101.com
там расписаны все операторы с хорошими примерами.
ну и используется это не только в java, но и в других языках

Озверин
Стримы уже придумали, можно
они такие медленные....
7 дек 18, 08:50    [21756617]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4360
вадя
Озверин
это же непонятная хрень!)) Как в этом разобраться?
как ни странно - достаточно просто.
тем более что есть шикарный инструмент для пробы и обучения https://regex101.com
там расписаны все операторы с хорошими примерами.
ну и используется это не только в java, но и в других языках

Озверин
Стримы уже придумали, можно
они такие медленные....


чтобы разобраться с кодом перейти в другой инструмент?
медленные стримы по сравнению с регекспом? Да я вас умоляю.
7 дек 18, 08:54    [21756619]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
Molasar
Member

Откуда:
Сообщений: 461
ваш пример выводит 0 и 1, нужно, чтобы не выводил
вадя
Озверин
Molasar, я извиняюсь, что не помогу вас, но у меня есть универсальный ответ на все подобные вопросы - не использовать рег выражения.
ну зачем так категорично?

https://regex101.com/r/uwH1WY/2

https://regex101.com/r/uwH1WY/2/codegen?language=java

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

final String regex = "(?(?=\\s[1|0]\\s)\\s[0|1]\\s|(\\d+[,|.]\\d+|\\d+))";
final String string = " 1778.89 0 45 987,45 1 5 6 1 ";

final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}
7 дек 18, 09:11    [21756629]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
Пылинка
Member

Откуда: СПб
Сообщений: 256
Molasar
ваш пример выводит 0 и 1, нужно, чтобы не выводил

Ну так переделай сам.
7 дек 18, 10:10    [21756698]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
Tsyklop
Member

Откуда: Украина
Сообщений: 664
Molasar, это делается циклом в разы быстрее чем регуляркой. Имею в виду не время работы приложения, а время потраченное на разработку.
7 дек 18, 12:02    [21756830]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14817
Tsyklop
Имею в виду не время работы приложения, а время потраченное на разработку.
по этому поводу есть анекдот про молодого и старого быков, которые стояли на горке и смотрели на стадо....
когда-то и ты быстро ползал, но тебя заставили ходить и ты счас можешь быстро ходить...
7 дек 18, 12:17    [21756857]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
Пылинка
Member

Откуда: СПб
Сообщений: 256
Tsyklop,
Тут еще "студент" наверно и постановку переврал, тут не нужно matcherNum.group(), тут просто нужен replaceAll.
7 дек 18, 12:17    [21756858]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14817
Пылинка
Тут еще "студент" наверно и постановку переврал, тут не нужно matcherNum.group(), тут просто нужен replaceAll.
ну как вариант... + split

а для практики

         String regex = "(?=\\s[10]\\s|[01]\\s|[01])\\s|(?<xxx>\\s\\d+[,.]\\d+|\\s\\d+)";
         String string = " 1778.89 0 45 987,45 1 5 6 1  0 1 0 32 1 ";

         Pattern pattern = Pattern.compile(regex);
         Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            
                System.out.println("Group " + matcher.group("xxx"));
           
        }

Group  1778.89
Group null
Group 45
Group 987,45
Group null
Group 5
Group 6
Group null
Group null
Group null
Group null
Group 32
Group null
только null выкинуть
7 дек 18, 12:23    [21756874]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7201
вадя
только null выкинуть

и в чем крутость регэкспа, если все равно потом что-то выкидывать надо?
какая разница, выкидывать в коде null или "0" и "1"
7 дек 18, 12:44    [21756911]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4360
Tsyklop
Molasar, это делается циклом в разы быстрее чем регуляркой. Имею в виду не время работы приложения, а время потраченное на разработку.


так и время отработки будет быстрей, как это не странно.

Что нить вроде:

List<String> result = Arrays.stream(dst.split(" ").filter(e->!(e.trim().length()==0 || e.equals("1") || e.equals("0"))).collect(Collectors.toList());


Решение хоть и в лоб, на пишется за полторы секунды, при изменении логики не надо лезть во вторичные инструменты и отрабатывает за меньшее время. Чего еще надо?
7 дек 18, 12:55    [21756928]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
Пылинка
Member

Откуда: СПб
Сообщений: 256
Leonid Kudryavtsev
вадя
только null выкинуть

и в чем крутость регэкспа, если все равно потом что-то выкидывать надо?
какая разница, выкидывать в коде null или "0" и "1"

Для отсечения есть replace в котором тоже есть регэксп
" 1778.89 0 45 987,45 1 ".replaceAll("\\s[1|0]\\s", " ");
Хотя формально остается вопросссс - что делать с " 1.0 001" и тд.
ps Лёня, как тебе ник -
+
https://www.sql.ru/forum/memberinfo.aspx?mid=253832
?
7 дек 18, 13:19    [21756971]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14817
Leonid Kudryavtsev
и в чем крутость регэкспа, если все равно потом что-то выкидывать надо?
какая разница, выкидывать в коде null или "0" и "1"
к сожалению я не суперспец в регулярных выражениях, может быть поэтому я не могу избавиться от null правильно, если кто подскажет - будет великолепно.
e.equals довольно медленная операция.... + stream также не быстро...
7 дек 18, 13:22    [21756982]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4360
вадя
Leonid Kudryavtsev
и в чем крутость регэкспа, если все равно потом что-то выкидывать надо?
какая разница, выкидывать в коде null или "0" и "1"
к сожалению я не суперспец в регулярных выражениях, может быть поэтому я не могу избавиться от null правильно, если кто подскажет - будет великолепно.
e.equals довольно медленная операция.... + stream также не быстро...


не думаю, что вы заметите разницу в этом случае по скорости работы, а вот поддерживать гораздо проще нечто, лаконично написанное и человеческим языком. regexp - нечеловеческий.
7 дек 18, 13:46    [21757016]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14817
Озверин
не думаю, что вы заметите разницу в этом случае по скорости работы, а вот поддерживать гораздо проще нечто, лаконично написанное и человеческим языком. regexp - нечеловеческий.

если ориентироваться на тех кто не сможет разобраться - нафиг тогда что- то делать.
а вот насчёт этой незаметной разницы уже наслышан...
но как придёшь куда-нибудь и из-за этой незаметной разницы сидишь и ждёшь, ждёшь....
7 дек 18, 15:08    [21757128]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7201
не верю, что регэксп будет быстрее split + цикла с if
мне кажется - как раз наоборот, регэксп может оказаться старее
7 дек 18, 15:11    [21757132]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4360
вадя
Озверин
не думаю, что вы заметите разницу в этом случае по скорости работы, а вот поддерживать гораздо проще нечто, лаконично написанное и человеческим языком. regexp - нечеловеческий.

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


зачем гадать на кольцах ? Берешь, пишешь тесты - убеждаешься в том, что был неправ ))))
7 дек 18, 15:14    [21757138]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14817
мне это нравится
        String j = " 1778.89 0 45 987,45 1 5 6 1 0 1 0 0 0 1 1 32 1 88.99 0 ";
        long s = System.nanoTime();
        String[] d = j.replaceAll("(?=\\s[10]\\s|[01]\\s|[01])\\s", "*").replaceAll("\\*[0|1]","").trim().split(" ");
        long ee = System.nanoTime();
        System.out.println(">" + (ee - s));
        for (String h : d) {
            System.out.println("--" + h);
        }


>4640716
--1778.89
--45
--987,45
--5
--6
--32
--88.99
7 дек 18, 16:45    [21757323]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать из строки все числа, кроме 0 и 1  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14817
Озверин
Что нить вроде:

List<String> result = Arrays.stream(dst.split(" ").filter(e->!(e.trim().length()==0 || e.equals("1") || e.equals("0"))).collect(Collectors.toList());

ты б делал не вроде а рабочий вариант, что б не гадать а сравнить
7 дек 18, 16:46    [21757327]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Java Ответить