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

#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] )*)"


Для тестирования попробуйте это регулярное выражение : ^(?:[ -]{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 (» «).