Java: Извлечение чисел из строки

Я пытался извлечь мои данные из строки, используя регулярное выражение.

Мои данные выглядят так:

12 170 0.11918
170 12 0.11918
 12 182 0.06361
182 12 0.06361
 12 198 0.05807
198 12 0.05807
 12 242 0.08457
242 12 0.08457
 11 30 0.08689
 30 11 0.08689

Проблемы здесь - это разное количество пробелов между двумя числами.

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

Pattern p = Pattern.compile("(([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))");
 Matcher m = p.matcher(" 6 7781 0.01684000");
 while (m.find()) {
 System.out.println(m.group(0)); 
 }

Я теперь свое регулярное выражение не работает. Кто-нибудь может помочь в подходящем регулярном выражении, поэтому я могу работать с данными или любой другой помощью для меня?

6 ответов

проверьте http://txt2re.com/index-java.php3?s=%2012%20170%200.11918&11&5&12&4&13&1

вы, вероятно, заинтересованы в int1, int2 и float1 ниже

public static void main(String[] args)
 {
 String txt=" 12 170 0.11918";

 String re1="(\\s+)"; // White Space 1
 String re2="(\\d+)"; // Integer Number 1
 String re3="(\\s+)"; // White Space 2
 String re4="(\\d+)"; // Integer Number 2
 String re5="(\\s+)"; // White Space 3
 String re6="([+-]?\\d*\\.\\d+)(?![-+0-9\\.])"; // Float 1

 Pattern p = Pattern.compile(re1+re2+re3+re4+re5+re6,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
 Matcher m = p.matcher(txt);
 if (m.find())
 {
 String ws1=m.group(1);
 String int1=m.group(2);
 String ws2=m.group(3);
 String int2=m.group(4);
 String ws3=m.group(5);
 String float1=m.group(6);
 System.out.print("("+ws1.toString()+")"+"("+int1.toString()+")"+"("+ws2.toString()+")"+"("+int2.toString()+")"+"("+ws3.toString()+")"+"("+float1.toString()+")"+"\n");
 }
 }


почему бы не прочитать каждую строку и сделать line.trim().split("\\s+")? Если ваш проект уже использовал guava, Splitter может использоваться.


Я рекомендую использовать Scanner.

Scanner scanner = new Scanner(line);
scanner.useDelimiter(" ");
int int1 = scanner.nextInt()
int int2 = scanner.nextInt()
****** ******1 = scanner.**********()


Попробуй это:

([\d.]+) - Это вызовет все строки, содержащие только цифры или периоды (.).

Редактировать:

Я вижу, вы хотите, чтобы три группы вышли из строя. Это вместо этого поможет игнорировать пустое пространство и захватить три группы чисел. Ведущее ^ и замыкающие $ убедитесь, что вы только соответствие на одной строке.

^\s*?([\d.]+)\s*([\d.]+)\s*?([\d.]+)\s*?$


String s = " 12 170 0.11918\n" + "170 12 0.11918 \n"
 + " 12 182 0.06361\n" + "182 12 0.06361 \n"
 + " 12 198 0.05807\n" + "198 12 0.05807 \n"
 + " 12 242 0.08457\n" + "242 12 0.08457 \n"
 + " 11 30 0.08689\n" + " 30 11 0.08689 \n";

 String[] lines = s.split("\\n");

 for( String line : lines ) {
 Scanner scan = new Scanner(line);
 scan.useDelimiter("\\s+");
 scan.useLocale(Locale.ENGLISH);
 System.out.println(scan.nextInt());
 System.out.println(scan.nextInt());
 System.out.println(scan.**********());
 }

Я бы использовал сканер для этой проблемы.


Что-то вроде этого (исправьте поплавковую часть по мере необходимости) -

# raw: (?m)^\h*(\d+)\h+(\d+)\h+(\d*\.\d+)
 # quoted: "(?m)^\\h*(\\d+)\\h+(\\d+)\\h+(\\d*\\.\\d+)"

 (?m) # Multi-line modifier
 ^ # BOL
 \h* # optional, horizontal whitespace
 ( \d+ ) # (1), int
 \h+ # required, horizontal whitespace
 ( \d+ ) # (2), int
 \h+ # required, horizontal whitespace
 ( \d* \. \d+ ) # (3), float

licensed under cc by-sa 3.0 with attribution.