2012-06-09 4 views
4

특정 옵션이 설정되어 있는지 테스트하기 위해 자바 정규 표현식을 만들려고합니다. 지금은 [ks]?[zx]?[ap]?을 가지고 있으므로 k, s 또는 아무것도없고, z, x 또는 아무것도없고 마지막으로 a, p 또는 아무것도 없습니다.임의의 순서없이 선택 무리에 대한 정규식

이 정규식 유일한 문제는 단지이 하나의 순서로 작동하지만 kza, azk, zka, kaz, akzzak이 같은 일을 할 수 있기 때문에, 모든 주문과 함께 작동해야합니다.

+0

왜 정규식을 사용합니까? 루프를 사용하고 몇 가지 플래그 (OR가 될 수 있음)를 정의하여 옵션 선택을 나타냅니다. – nhahtdh

+0

문제에 대한 자세한 정보를 제공해 주시겠습니까? 이것에 대한 수많은 해결책이 있으며, 최선의 상황은 전체 상황이 밝혀 질 때까지 분명하지 않을 것입니다 ... – will

+0

나는 단순히 "각 쌍의 옵션"(k 또는 s; z 또는 x; 또는 p) 단 하나 (또는 ​​없음) 옵션 만 선택됩니다. 예를 들어 "zx"옵션은 각 옵션이 다른 옵션을 대체하므로 의미가 없습니다. 물론 이것을 반복 할 수는 있지만 간단히 이것을 확인하는 멋진 정규식이있을 것이라고 생각했습니다. – xZise

답변

2

강철 자신 -이 답변은 쓰기 전용 언어로 정규 표현식을 강화합니다!

^(?x: 
    ( ( [ks] (?!.*[ks]) ) 
    | ( [zx] (?!.*[zx]) ) 
    | ( [ap] (?!.*[ap]) ) 
    ) {0,3} 
)$ 

이 버전은 각 그룹과 일치하는 그룹 아무튼 경우에만 : 당신은 여러 줄 문자열 그루비 (또는 Java 7)를 사용하는 경우

^(([ks](?!.*[ks]))|([zx](?!.*[zx]))|([ap](?!.*[ap]))){0,3}$ 

더 명확과 같이 쓸 수있다 나중에 문자열에 어딘가에 나타납니다. 이것은 '제로 너비, 앞을 내다 본다'.

+0

''azp ''또는''aza "'는 정규 표현식과 일치하지만, 그렇게해서는 안된다. – nhahtdh

+0

@nhahtdh 아, 맞아. 나는 look ahead 어설 션에'. * '을 추가하여 그것을 해결했다. –

+1

나는 정규 표현식을 좋아하지만 현자가 말한 것처럼 "때로는 프로그래밍 문제가있어 정규 표현식을 사용하는 것이 가장 좋은 해결책 인 것 같습니다. 이제 두 가지 문제가 있습니다." –

0

내가 이해했다면 '?' '파이프'로 시도 : "[ks]|[zx]|[ap]"

+0

아니요, 이것은'kaz '를 허용하지 않습니다. – xZise