정규식 질문입니다!!

조회수 1952회

아래 텍스트에서 10.200.180.2, 10.200.180.3 값만 찾으려고 합니다. 문제는 앞에 64:16:8d:dc:6c:40 이와 같이 MAC정보가 있는 경우에만 IP정보가 선택이 되어야 합니다. 그래서 아래와 같은 정규식으로 64:16:8d:dc:6c:40 10.200.180.2, 00:02:a5:74:9b:19 10.200.180.3 이렇게 는 찾을수 있는데 찾은 대상에서 IP정보만 출력하게 할수 있을까요? 이게 정규식 한번으로 처리해야 하는거라 방법을 찾지 못하고 있네요ㅠ [A-Za-z0-9][A-Za-z0-9][:][A-Za-z0-9][A-Za-z0-9][:][A-Za-z0-9][A-Za-z0-9][:][A-Za-z0-9][A-Za-z0-9][:][A-Za-z0-9][A-Za-z0-9][:][A-Za-z0-9]A-Za-z0-9{3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])

admin@Test_M7i# show | compare [edit interfaces fe-1/3/0 unit 0 family inet address 10.200.180.1/24]

  • arp 10.200.180.5 mac 00:02:a5:74:9b:19;
  • arp 10.200.180.5 mac 18:67:b0:b6:ae:8d; arp 10.200.180.6 { ... }

admin@Test_M7i> show arp no-resolve MAC Address Address Interface Flags 64:16:8d:dc:6c:40 10.200.180.2 fe-1/3/0.0 none 00:02:a5:74:9b:19 10.200.180.3 fe-1/3/0.0 permanent

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 자바 버전의 방법은 다음과 같습니다.

    import java.io.Console;
    import java.util.regex.Pattern;
    import java.util.regex.Matcher;
    
    public class MyRegex{
        public static void main(String[] args){
            String searchTarget = "64:16:8d:dc:6c:40 10.200.180.2, 00:02:a5:74:9b:19 10.200.180.3 10.200.180.5 10.200.180.6";
    
            Pattern pattern = Pattern.compile("[0-9a-e]{2}\\:[0-9a-e]{2}\\:[0-9a-e]{2}\\:[0-9a-e]{2}\\:[0-9a-e]{2}\\:[0-9a-e]{2}\\s(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})");
            Matcher matcher = pattern.matcher(searchTarget);
            while(matcher.find()){
                System.out.println(matcher.group(1));
            }
        }
    }
    

    참고로 자바는 escape를 위해서 \\와 같이 두번 적어주어야 합니다.

    • 정말 감사합니다!! 이걸로 몇시간을 보낸건지...ㅠㅠ 잘되네요!!! 알 수 없는 사용자 2016.4.20 22:02
  • capturing group이라는걸 이용하면 됩니다.

    아래는 파이썬 코드인데요. search_target에 들어있는 ip를 찾아서 출력해 줍니다. regex를 보면 \s를 기준으로 그 이전의 MAC address가 있는 경우에만 그 뒤의 ip만 찾아 옵니다.

    regex = r'[0-9a-e]{2}\:[0-9a-e]{2}\:[0-9a-e]{2}\:[0-9a-e]{2}\:[0-9a-e]{2}\:[0-9a-e]{2}\s(?P<url>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
    
    search_target = "64:16:8d:dc:6c:40 10.200.180.2, 00:02:a5:74:9b:19 10.200.180.3 10.200.180.5 10.200.180.6"
    
    import re
    result = re.findall(regex, search_target)
    print("\n".join(result))
    

    위 코드의 아래에 있는 실행하기 버튼을 누르면 직접 실행해 보실 수 있어요.

    • Python에서는 정상적으로 처리되는데 Java에서는 ?P 이 구문때문에 에러가 발생하면서 처리되지 않네요ㅠ 알 수 없는 사용자 2016.4.20 17:28
    • 별도 답변으로 자바를 달았습니다. 정토드 2016.4.20 18:09

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)