2013-10-01 2 views
0

나는 "% d- % m- % Y"와 같은 문자열을 가지고 있습니다. 이러한 용어는 임의의 순서로 사용할 수 있으며 대시는 다른 문자열 (% x). "% d % m % Y"결과를 얻고 싶습니다. 내가 간단한 정규식 구운 나는 용어가 선택 할 경우 작동 솔기하지 않습니다 이 (크롬 콘솔 :임의의 용어와 임의의 순서로 (자바 스크립트 또는 자바)

"%d-%m-%Y HH:%i".replace(/.*?((%Y|%m|%d)?.*?(%Y|%m|%d)?.*?(%Y|%m|%d)?).*/, "$1 $2 $3 $4") 

에서이 작업을 수행 I가이 (% Y | %의 m | % d 개) ? 옵션으로 3 번 *.? (욕심이 아닌 것).

나는 위의 코드를 실행하면 출력은 다음과 같습니다

"%d %d  " 

내가 (%의 Y | %의 m | % d 개)에서 선택 마커를 제거하면? 표현식이 예상대로 작동합니다. 해당 용어가 선택 사항이어야합니다. 누군가가 선택 마커로 어떤 일이 일어나는지 설명 할 수 있습니까?이 유형의 정규식을 수행 할 수 있습니까?

+0

선택적으로 당신은''% d- % m ''도 합법적일까요? 나는''% d- % d "'가 합법적이지 않으므로 정규 표현식이 올바른 도구가 아니라고 말하고 싶습니다. 자바의 정규식 엔진 (또는 다른 어떤 것)으로도 이것을 할 수 있을지 확신하지 못합니다. 그리고 그것은 꽤 어려울 수도 있습니다. – Thomas

+0

예, "% d- % m"은 (는) 합법적이며 "% d- % d"이 (가) 발생할 수 없습니다. –

+0

그래서 3 개가 필요하지만 한 번만, 어떤 순서로든 중간에 무엇이든 필요합니까? – Thomas

답변

0

나는 당신의 요구 사항에 대한 확실하지 않다하지만 어쩌면 2 단계 접근 방식은 작동합니다 :

  1. %d.*%m.*%Y의 순열을 추출, 예를 들어, temp = input.replaceAll(".*(%(?:d|m|Y).*%(?:d|m|Y).*%(?:d|m|Y)).*", "$1")

  2. 를 사용하여 %d, %m%Y, 예를 들면 콘텐츠의 대체

    String input ="xx %Y-%m-%d xx";  
    String temp = input.replaceAll(".*(%(?:d|m|Y).*%(?:d|m|Y).*%(?:d|m|Y)).*", "$1"); 
    String output = temp.replaceAll("(?<=%(?:d|m|Y))(.*?)(?=%(?:d|m|Y))", " "); 
    
    System.out.println(output); //results in "%Y %m %d" 
    

    참고 : temp.replaceAll("(?<=%(?:d|m|Y))(.*?)(?=%(?:d|m|Y))", " ");

자바 예를 사용하여 을 -이 세 구성 요소가 필요, 즉 %d-%m이 일치하지 않습니다. - "%d-%d" 여전히 허용됩니다. 정규식으로 확인하는 것은 어려울 것입니다.

업데이트 : 다음 표현식은 1-3 단계를 허용해야합니다 : 1 단계에서 .*?(%(?:d|m|Y)(?:.*%(?:d|m|Y)){0,2}).*.

+0

내 정규식은 비 선택적인 용어에 대해서도 작동하지만, 용어를 선택하는 즉시 (예를 들어 % Y- % d 만 사용하도록) 그때 그것은 misteriously 깰 –

+0

내 최고의 솔루션 3 regexses를 만드는 것 : 1 용어 하나 2 용어와 하나 3 용어와 함께 하나라고 생각합니다. 올바른 정규 표현식을 적용하기 전에 % Y, % m 및 % d을 indexOf 할 수 있고 그 중 몇 개가 있는지 계산하고 2가있는 경우 2 개의 인수를 사용하여 정규식을 적용합니다. –

+0

@OvidiuBuligan은 내 업데이트를 참조하십시오. 당신은 여전히 ​​하나의 용어의 여러 번 발생 여부를 계산해야합니다. – Thomas

관련 문제