[기타]Ant Style Pattern 정리

Juseong Han·2022년 9월 16일
0

궁금증

Spring 프로젝트는 url 패턴을 정의할 때 /resources/**/static/** 와 같이 Ant pattern을 자주 사용한다. 그렇다면 ant pattern은 어떻게 작성하는 것이며 *와 **등의 기호는 뭘까??

정리

1. Antpattern 에서 사용 가능한 특수기호

3 가지의 특수기호가 존재한다

  • ? : 1개의 문자와 매칭되어야 한다.
  • * : 0개 이상의 문자와 매칭되어야 한다.
  • ** : 0개 이상의 경로 또는 파일과 매칭되어야 한다.

2. 사용방법예제

다음 Test코드의 결과는 pass이다 여러가지 응용패턴을 보면서 사용법을 익혀보도록한다.

import org.junit.Test;
import org.springframework.util.AntPathMatcher;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;

public class AntPatternTest {

    @Test
    public void antPatternTest() {
        // **
        assertThat(checkAntPattern("/board/**", "/board/football")).isEqualTo(true);
        assertThat(checkAntPattern("/board/**", "/board/baseball/a")).isEqualTo(true);
        assertThat(checkAntPattern("/board/**", "/board/baseball/a/b/c")).isEqualTo(true);
        assertThat(checkAntPattern("/board/**", "/board")).isEqualTo(true);
        assertThat(checkAntPattern("/board/**", "/board/something.jpg")).isEqualTo(true);
        assertThat(checkAntPattern("/board/**", "/baseball/board")).isEqualTo(false);

        assertThat(checkAntPattern("/**/board/**", "/a/b/c/board/d/e/f")).isEqualTo(true);
        assertThat(checkAntPattern("/**/board", "/a/b/c/board/baseball")).isEqualTo(false);

        // *
        assertThat(checkAntPattern("/board/*", "/board")).isEqualTo(false);
        assertThat(checkAntPattern("/board/*", "/board/baseball")).isEqualTo(true);
        assertThat(checkAntPattern("/board/*", "/board/baseball/a")).isEqualTo(false);
        assertThat(checkAntPattern("/board/*", "/board/baseball/a/b/c")).isEqualTo(false);

        assertThat(checkAntPattern("/board/*ball", "/board/tennis")).isEqualTo(false);
        assertThat(checkAntPattern("/board/*ball", "/board/baseball")).isEqualTo(true);

        assertThat(checkAntPattern("/board*/*ball", "/boardabcd/baseball")).isEqualTo(true);
        assertThat(checkAntPattern("/board*/*ball", "/board/baseball")).isEqualTo(true);

        // ?
        assertThat(checkAntPattern("/board/?", "/board")).isEqualTo(false);
        assertThat(checkAntPattern("/board/?", "/board/a")).isEqualTo(true);
        assertThat(checkAntPattern("/board/?", "/board/aa")).isEqualTo(false);
        assertThat(checkAntPattern("/board/??ball", "/board/abball")).isEqualTo(true);
        assertThat(checkAntPattern("/board/??ball", "/board/abcball")).isEqualTo(false);
        assertThat(checkAntPattern("/board-?/???.jpg", "/board-a/abc.jpg")).isEqualTo(true);
        assertThat(checkAntPattern("/board-?/???.jpg", "/board-a/abc.jpeg")).isEqualTo(false);
    }

    private boolean checkAntPattern(String pattern, String msg) {
        AntPathMatcher antPathMatcher = new AntPathMatcher();
        return antPathMatcher.match(pattern, msg);
    }
}
profile
개발이 하고 싶어요💻 개발이 너무 재밌는 Juseong입니다.🖐

0개의 댓글