#java #regex #string
#java #регулярное выражение #строка
Вопрос:
Мой код выглядит следующим образом:
String realNumber = "[ -]?[\d] (?:[\.][\d] )?";
s.next(realNumber "[\s] " realNumber);
Полное регулярное выражение:
[ -]?[\d] (?:[\.][\d] )?[\s] [ -]?[\d] (?:[\.][\d] )?
Это не работает.
Если я использую s.next(realNumber);
его, он отлично работает для одного действительного числа, т. Е. 321.1
Или 12
и т. Д. Пробел — это та часть, которая, по-видимому, вызывает исключение несоответствия.
Я пытался заставить это работать в течение последнего часа>.> Пожалуйста, помогите!
Шаблоны, которые должны совпадать:
1 1
1.1 2.1
123 1.123
123.123 1
Я получил его для успешной работы regex101.com : https://regex101.com/r/fM7uA5/100 , но он все равно выдает исключение в Java.
Комментарии:
1. В стороне: вам не нужны классы символов, если там есть только одна вещь. Например.
[\d]
это то же самое, что\d
.2. Попробуйте экранировать
-
в[ -]
классе символов. Обычно оно используется для указания диапазона.3. @AndyTurner Я считаю, что квадратные скобки вокруг символа облегчают чтение. Кроме
-
того[ -]
, кажется, что in работает нормально, вы задаете допустимую точку, но[\s]
, похоже, виновник в этом случае.4. Я предполагаю, что
s
это экземплярScanner
класса. По умолчанию этот класс использует пробел в качестве разделителя, поэтому ваше регулярное выражение должно описывать только один токен. Было бы проще использоватьnextDouble
дважды.
Ответ №1:
РЕДАКТИРОВАТЬ: после того, как вы уточните, что хотите извлечь два действительных числа (для простого тестирования см. Более эффективное решение ниже).
Для захвата и извлечения действительных чисел используйте это регулярное выражение: "([ -]{0,1}[d] (?:.[\d] )*)"
- Пример ideone, работающий на Java.
- Рабочий пример регулярного выражения 101 для тестирования и извлечения.
Для тестирования попробуйте это регулярное выражение : ^(?:[ -]{0,1}[d] (?:.[d] )*s*){2}$
. Это эффективно работает для тестирования!
Комментарии:
1. Это также работает для одного действительного числа, должно быть ровно два действительных числа. У меня есть пример здесь: regex101.com/r/EwqLNO/6
2. Однако в примере есть необязательный пробел — пробел должен быть обязательным. Если я использую
s
, это по какой-то причине не работает. Есть идеи?3. @ChickenFeet не получает то, что вы хотите. regex101.com/r/EwqLNO/8 кажется, это касается всех ваших дел.
4. regex101.com/r/EwqLNO/9 тоже должно сработать — но он все равно выдает исключение в Java.
5. @ChickenFeet Я добавил этот регистр в свой Java-код, он также работает.
Ответ №2:
Так что не совсем то, что мне было нужно, но Java отказалась вести себя. Итак, обходной путь заключается в следующем:
double x, y;
String realNumber = "[ -]?[\d] (?:[\.][\d] )?";
x = Double.valueOf(s.next(realNumber));
y = Double.valueOf(s.next(realNumber));
Комментарии:
1. Вы должны были уточнить, что это то, что вы хотели. Я обновил свой Java-код, добавив хороший способ проверки и извлечения действительных чисел.
2. Изначально я не хотел извлекать два действительных числа. Я хотел вернуть строку, а затем извлечь из строки, используя метод split (» «).