Можно ли разбить строку по всем специальным символам и пунктуации, кроме периода? - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь разделить строку, чтобы извлечь из нее значение Float, но мне также нужно сохранить оставшуюся часть строки (по порядку). Например: строка "# 345.23)" станет ["#", "345.23", ")"].

Поскольку разделение на "\ b" разбивает его на знаки препинания / специальные символы, тогда я подумал, что могу использовать это и добавить дополнительное условие, чтобы сказать "разделить на все знаки пунктуации, КРОМЕ ТОЧКИ периода". Моя логика верна или мое регулярное выражение далеко?

 if (containsFloat(str)) {
        String[] pp = str.split("\\b(^\\.)");
        System.out.println(pp[0]);
        System.out.println(pp[1]);
        System.out.println(pp[3]);
    }

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Если вам просто нужно сохранить строку без поплавков, вы можете сделать что-то вроде этого:

String str = "asdja#345.23)asd0.87ahsdflj%4.5fdshjk&10.0&1";
Matcher m = Pattern.compile("\\d*\\.?\\d+").matcher(str);

while(m.find()) {
    Float f = Float.parseFloat(m.group());
    System.out.println(f);
    str = str.replace(m.group(), "");
}
System.out.println(str);

Выход:

345.23
0.87
4.5
10.0
1.0
asdja#)asdahsdflj%fdshjk&&

Или, чтобы не плавать в массиве, просто разделить ваш шаблон, как вы делали это раньше:

String str = "asdja#345.23)asd0.87ahsdflj%4.5fdshjk&10.0&1";
Matcher m = Pattern.compile("\\d*\\.?\\d+").matcher(str);

while(m.find()) {
    Float f = Float.parseFloat(m.group());
    System.out.println(f);
}

String[] strings = str.split("\\d*\\.?\\d+");
System.out.println(Arrays.toString(strings));

Выход:

345.23
0.87
4.5
10.0
1.0
[asdja#, )asd, ahsdflj%, fdshjk&, &]
0 голосов
/ 22 января 2019

Вы можете попытаться использовать String#split() здесь, но может иметь смысл использовать формальное сопоставление с регулярным выражением.Вот короткий скрипт, который показывает, как это сделать.Для сопоставления используется следующий шаблон:

\d+(?:\.\d+)?|\D+

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

String input = "#345.23)abc123%^*#867.5309&&&12";
String pattern = "\\d+(?:\\.\\d+)?|\\D+";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(input);

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

#
345.23
)abc
123
%^*#
867.5309
&&&
12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...