2013-06-19 2 views
0
import java.util.regex.*; 

public class RegexString { 

    public static void main(String args[]){ 

     // String to be scanned to find the pattern. 

     String line = "control.avgo: 29 50.49854 50.504984 50000 50.5000001 0.0 1 2" 


     String pattern = "()()()()()()()()"; 

     // Create a Pattern object 
     Pattern r = Pattern.compile(pattern); 

     // Now create matcher object. 
     Matcher m = r.matcher(line); 
     if (m.find()) { 
     System.out.println("Found value group 0: " + m.group(0)); 
     System.out.println("Found value group 1: " + m.group(1)); 
     System.out.println("Found value group 2: " + m.group(2)); 
     System.out.println("Found value group 3: " + m.group(3)); 
     System.out.println("Found value group 4: " + m.group(4)); 
     System.out.println("Found value group 5: " + m.group(5)); 
     System.out.println("Found value group 6: " + m.group(6)); 
     System.out.println("Found value group 7: " + m.group(7)); 

     } else { 
     System.out.println("Pattern is no good!"); 
     } 
    } 
} 

Приветствую всех!Построение определенного регулярного выражения

Вышеприведенный простой пример, который я нашел в регулярном выражении, я хочу сделать, это построить шаблон регулярного выражения, чтобы извлечь каждое из этих чисел целые числа и удвоения и поместить их в каждую группу. Мое исследование до сих пор было в состоянии получить целые числа, я не знаю, как извлечь каждый из двойников int и поместить их в каждую группу?!? Я понимаю концепцию группировки, следовательно,()()()()() .... Было бы проще смотреть на пробелы и извлекать числа внутри них или может (int) (double) (double) (int) (double) (int) (int) выражается?

+0

Похоже, вы раскалываете пространство. Вы, вероятно, не нуждаетесь в регулярном выражении здесь. Попробуйте 'line.split (" \\ s + ");' – devnull

+0

Я действительно очень удивлен, что ваш шаблон что-то делает. Какой результат вы получаете от запуска программы? – kutschkem

+0

Он выводит с найденными значениями пробелы во всех группах. –

ответ

1

вы можете заменить ваши int сек что-то вроде [0-9]+ и ваших double с для [0-9]+\.?[0-9]*, и вы должны быть в порядке, для ввода аналогично образцу одного.

String pattern = "([0-9]+) *([0-9]+\\.?[0-9]*) *([0-9]+\\.?[0-9]*) *([0-9]+) *([0-9]+\\.?[0-9]*) *([0-9]+) *([0-9]+)"; 

(EDIT) это работало нормально с входом (использовать группы от 1 до 8, чтобы получить номера):

String pattern = "([0-9]+) *([0-9]+\\.?[0-9]*) *([0-9]+\\.?[0-9]*) *([0-9]+) *([0-9]+\\.?[0-9]*) *([0-9]+\\.?[0-9]*) *([0-9]+) *([0-9]+)"; 
+0

В первой группе есть ошибка о недействительных escape-последовательностях, FYI Я использую Eclipse, если это помогает. –

+0

Я его редактирую. Java regexen не нравится '\ .' :-D – Massa

+0

Вывод группы 0: 29 50.49854 50.504984 50000 50.5000001 0.0 1 2 Мне это нужно, чтобы его было равно 29 и так далее. =) Кроме того, ответ почти на месте! –

1

Работает ли это регулярное выражение на то, что вам нужно делать?

String pattern = "([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+)"; 

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

line.split(" "); 

Обратите внимание, что в каждом из этих случаев значение, которое вы получаете, является строкой. Вам нужно будет преобразовать их в целые числа или удваивать, используя Integer.parseInt() или Double.parseDouble().

РЕДАКТИРОВАТЬ

Чтобы игнорировать первый раздел - control.avgo

String pattern = "[^ ]+ ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+)"; 

Matcher.group(0) специфически соответствует всему шаблону. Поэтому просто не используйте его.

+0

это результат: Найдено значение группы 0: control.avgo: 29 50.49854 50.504984 50000 50.5000001 0.0 1 Найдено значение группы 1: control.avgo: Найдено значение группы 2: 29 Найдено значение группы 3: 50,49854 Найдено значение группы 4: 50,504984 группа Найдено значение 5: 50000 Найдено значение группы 6: 50,5000001 Найдено значение группа 7: 0.0 –

+0

В идеале я хотел бы, чтобы каждая группа была специфичной для одного номера, если это имеет смысл? –

+0

Непонятно. группа значений 3 - 50,49854. Аналогично, группа значений 5 - 50000. Вы говорите, что хотите, чтобы control.avgo игнорировался? Не смотрите на группу 0, так как она соответствует всему шаблону. –

2

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

^\S+\s(\d+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\d+)\s(\d+) 

Для вашего удобства здесь ссылка для проверки ваших регулярных выражений .. это очень полезно. http://gskinner.com/RegExr/

Смежные вопросы