2014-01-21 4 views
0

선택적 후행 문자열을 제거하여 선행 문자열을 추출하려고합니다. 후행 문자열은 가능한 선행 문자열의 하위 집합이지만 그 반대는 아닙니다. 선행 문자열이 [a-z]+이고 후행 문자열이 c 인 경우를 가정하십시오. 따라서 "abc"에서 "ab"를 추출하고 "ab"에서 "ab"를 얻고 싶습니다. 이런 식으로 뭔가 :정규 표현식 - 욕심쟁이 일치?

^([a-z]+)(?:c|) 

문제는 [a-z]+이 대안의 빈 옵션을 사용하여 전체 문자열과 일치하는지, 그래서 움켜 값이 "ABC"또는 "AB"입니다. ((?:은 두 번째 파트를 가져 오지 말라고 알려줍니다.) 나는 더 긴 옵션 또는 대안의 첫 번째 옵션을 사용하고 첫 번째 옵션과 일치하는 것을 결정하는 방법을 원합니다.

나는 또한 대안 모두 내부에 원하는 목표를두고 노력했다

:

^([a-z]+)c|^([a-z]+) 

내가이 두 가지 가능한 대안의 첫 번째 일치하는 것을 선호한다고 생각하지만, 나는 위와 같은 결과를 얻을 수 .

저는 R에서 이것을하고 있습니다. 그래서 POSIX 또는 Perl 정규 표현식 라이브러리를 사용할 수 있습니다.

(실제 문제는 선물 거래와 관련이 있으며, [A-Z0-9]+과 같은 루트 "계좌 이름"과 [FGHJKMNQUVXZ][0-9]{1,2}과 같은 "만료 코드"가 있습니다. "ZNH3"과 같은 기호가 주어지면 "H3" .. "ZN"를 얻을하지만 그것을 줄 경우 "ZN"나는 또 다시 "ZN를"싶어하는)

답변

1

이 시도 :

> library(gsubfn) 
> strapplyc(c("abc", "abd"), "^(\\w+?)c?$", simplify = TRUE) 
[1] "ab" "abd" 

과 더욱 쉽게 :

> sub("c$", "", c("abc", "abd")) 
[1] "ab" "abd" 
1
vec <- c("ZNH3", "ZN", "ZZZ33", "ABF") 

sub("(\\w+)[FGHJKMNQUVXZ]\\d{1,2}", "\\1", vec) 
# [1] "ZN" "ZN" "ZZ" "ABF" 
0

는 정규 표현식의 첫 부분에 대한 '비 욕심'일치를 사용하여 '끝 문자열로 고정하여'선택 허용 접미사 '의 정의 다음 :다음은 작업 정규 표현식이다 '... 허용 (단, 옵션) suff 다음에 가능

  • ([FGHJKMNQUVXZ][0-9]{1,2})? 적은 문자로

    이 정규식 (.+?)([FGHJKMNQUVXZ][0-9]{1,2})?$ 일치 ...

    • (.+?) 문자열의 끝에 다음 IX
    • $

    필요한 결과에

  • +0

    PHP 코드? 사용자가 R에서 이것을 원한다고 생각합니다 – BrodieG

    +0

    PHP 코드에 사과드립니다. 그러나 정규 표현식 분석은 여전히 ​​유효합니다. 구체적으로 : '욕심쟁이가 아닌 일치,'옵션 접미사 ','문자열 끝 '에 고정, 나는 PHP를 해킹 할 것입니다 .-) –

    0

    변형 :-) ('R'에서 참조 될 수 있지만)의 일치의 제 촬상 소자에 욕심없는 대답은 기본 코드 만 사용하십시오.

    codes <- c("ZNH3", "CLZ4") 
    matched <- regmatches(codes, regexec("^([A-Z0-9]+?)[FGHJKMNQUVXZ][0-9]{1,2}$", codes)) 
    # [[1]] 
    # [1] "ZNH3" "ZN" 
    # 
    # [[2]] 
    # [1] "CLZ4" "CL" 
    sapply(matched, `[[`, 2) # extract just codes 
    # [1] "ZN" "CL"