2014-01-30 7 views
0

У меня есть текст, как это:Регулярное выражение для извлечения текста

SrcAddr: 0.0.21.201 
DstAddr: 7.202.10.100 
NextHop: 0.33.189.142 
InputIf: 19 
OutputIf: 50715 

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

String SrcAddr = "0.0.21.201"; 
    String DstAddr = "7.202.10.100"; 
    //ect... 

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

+0

Можете ли вы показать, что вы пробовали? – Kieveli

+0

Этот вопрос кажется не по теме, потому что он не показывает никаких исследований до публикации. – OGHaza

ответ

2

Вы можете использовать что-то вроде этого:

String input = "SrcAddr: 0.0.21.201\n"+ 
      "DstAddr: 7.202.10.100\n"+ 
      "NextHop: 0.33.189.142\n"+ 
      "InputIf: 19\n"+ 
      "OutputIf: 50715"; 

String SrcAddr=getMatchedString("SrcAddr",input); 
String NextHop=getMatchedString("NextHop",input); 
String InputIf=getMatchedString("InputIf",input); 
String OutputIf=getMatchedString("OutputIf",input); 

System.out.println(SrcAddr); 
System.out.println(NextHop); 
System.out.println(InputIf); 
System.out.println(OutputIf); 

.......... 

public static String getMatchedString(String word,String input){ 

    String REGEX = "(?:"+word+":)\\s(.*)"; 
    Pattern p = Pattern.compile(REGEX); 
    Matcher m = p.matcher(input); 
    if (m.find()) { 
     String matched = m.group(1); 
     return matched; 
    } 
    return null; 

} 

ВЫХОДА

0.0.21.201 
0.33.189.142 
19 
50715 

REGEX DEMO

0

Вы можете попробовать:

String in = " SrcAddr: 0.0.21.201\nDstAddr: 7.202.10.100\n NextHop: 0.33.189.142\n InputIf: 19\n OutputIf: 50715"; 

    Pattern src = Pattern.compile("SrcAddr:\\s+([\\d\\.]+)"); 
    Pattern dst = Pattern.compile("DstAddr:\\s+([\\d\\.]+)"); 
    Pattern nextHop = Pattern.compile("NextHop:\\s+([\\d\\.]+)"); 
    Pattern inputIf = Pattern.compile("InputIf:\\s+([\\d]+)"); 
    Pattern outputIf = Pattern.compile("OutputIf:\\s+([\\d]+)"); 

    Matcher srcMatcher = src.matcher(in); 
    Matcher dtsMatcher = dst.matcher(in); 
    Matcher nextHopMatcher = nextHop.matcher(in); 
    Matcher inputIfMatcher = inputIf.matcher(in); 
    Matcher outputIfMatcher = outputIf.matcher(in); 

    if (srcMatcher.find()) { 
     System.out.println(srcMatcher.group(1)); 
    } 
    if (dtsMatcher.find()) { 
     System.out.println(dtsMatcher.group(1)); 
    } 
    if (nextHopMatcher.find()) { 
     System.out.println(nextHopMatcher.group(1)); 
    } 
    if (inputIfMatcher.find()) { 
     System.out.println(inputIfMatcher.group(1)); 
    } 
    if (outputIfMatcher.find()) { 
     System.out.println(outputIfMatcher.group(1)); 
    } 

Надеется, что это помогает!

1
String input = "SrcAddr: 0.0.21.201\n"+ 
       "DstAddr: 7.202.10.100\n"+ 
       "NextHop: 0.33.189.142\n"+ 
       "InputIf: 19\n"+ 
       "OutputIf: 50715"; 

String SrcAddr = input.replaceAll("(?s).*SrcAddr:\\s([\\d\\.]+)\\s.*", "$1"); 
String DstAddr = input.replaceAll("(?s).*DstAddr:\\s([\\d\\.]+)\\s.*", "$1"); 

System.out.println(SrcAddr); 
System.out.println(DstAddr); 

Печать:

0.0.21.201 
7.202.10.100 
-1

проверить это онлайн Java регулярное выражение тестер: http://www.regexplanet.com/advanced/java/index.html

я вставил в текст на 'вход 1', а затем положить в регулярном выражении:

\d*[.]\d*[.]\d*[.]\d* 

Результаты:

[10,20] 0.0.21.201 
[32,44] 7.202.10.100 
[56,68] 0.33.189.142 

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

"\\d*[.]\\d*[.]\\d*[.]\\d*" 

Кроме того, здесь весело регулярное выражение игры, чтобы помочь вам узнать регулярные выражения: http://regexcrossword.com/

1

Попробуйте это, он принимает вашу строку с несколькими линиями в качестве входных данных, и выплевывает номера (IP-адресов и портов, судя по нему) построчно.

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

import java.util.Scanner; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 


public class MainRegex { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     String input = "SrcAddr: 0.0.21.201\n"+ 
         "DstAddr: 7.202.10.100\n"+ 
         "NextHop: 0.33.189.142\n"+ 
         "InputIf: 19\n"+ 
         "OutputIf: 50715"; 

     Scanner scanner = new Scanner(input); 
     while (scanner.hasNextLine()) { 
      String line = scanner.nextLine(); 
      String output = matchString(line); 
      System.out.println(output); 
     } 
     scanner.close(); 

    } 

    public static String matchString(String input){ 
     String regex = "(?:\\w*:)((?:\\d+\\.?)*)"; 
     Pattern p = Pattern.compile(regex); 
     Matcher m = p.matcher(input); 
     if (m.find()) { 
      String matched = m.group(1); 
      return matched; 
     } 
     return null; 
    } 

} 

Выход:

0.0.21.201 
7.202.10.100 
0.33.189.142 
19 
50715 

В цикле сканирования можно обработать строку. Я не мог понять ваш вопрос, если вы только хотели получить числа или заменить каждую строку на String [name] = "[number]". Если это так, вам просто нужно слегка вмешаться в цикл сканера, а также удалить группы, не захватывающие в регулярном выражении (это означает, удалить «?:» Перед \ w), чтобы он также захватывал слова ,

Надеюсь, это поможет!

+1

Кстати, используя этот способ, вам не нужно знать сами слова, например «SrcAddr» и т. Д., Заранее. – CodingDuckling

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