2012-05-02 5 views
0

일부 조건에 따라 대문자를 찾아 대입 할 정규식을 만들고 싶습니다.일부 조건에 따라 정규 표현식을 만드는 방법

문자열에서 대문자 그룹의 시작 대문자를 찾아 소문자로 바꾸고 시작 대문자 앞에 *을 대치하십시오. 대문자 다음에 소문자가 있으면 대문자를 소문자로 바꾸고 시작 대문자보다 앞에 *을 붙입니다.

입력 문자열 : stackOVERFlow

예상 출력 : stack*over*flow

내가 시도했지만 완벽하게 작동을 가져올 수 없습니다.

정규식을 만드는 방법에 대한 아이디어가 있습니까? 감사합니다.

+0

귀하의 입/출력이 귀하의 설명에 동의하지 않는다고 생각합니다. – Brendan

답변

4

예상되는 입력과 출력은 약간 비논리적입니다. "흐름"의 "f"는 소문자로 나타내지 만 별표에는 포함시키지 마십시오.

어쨌든, 원하는 정규식은 매우 간단합니다 : @"[A-Z]+?". 이는 하나 이상의 대문자 알파 문자의 문자열을 비 일치 적으로 일치시킵니다 (일치하는 문자 클래스가 상대적으로 좁 으면 어떤 방식 으로든 차이가 있다고 생각하지 마십시오). 이것은 단순히 하나 개 이상의 대문자 알파벳 문자의 모든 항목을 발견하고, 일치하는 항목을 찾아 어디든지 그것을 대체

Regex.Replace(inputString, @"([A-Z]+?)", "*$1*").ToLower(); 

: 이제

, 당신은 다음과 같은 일을 할 것, 교체/찾기를 할 수 별표로 둘러싸인 그 자체. 이것은 주위를 처리하지만 lowercasing은 수행하지 않습니다. .NET Regex는 그런 종류의 문자열 수정을 제공하지 않습니다. 그러나 작업의 최종 결과는 모두 소문자 문자가있는 문자열이어야하므로 ToLower()를 사용하여 정확하게 결과를 얻으므로 예상 결과를 얻을 수 있습니다.

0

KeithS의 솔루션은 그러나,이 별들 사이의 f을 포함 stack*overf*low을 얻을 것입니다 조금

Regex.Replace("stackOVERFlow","[A-Z]+","*$0*").ToLower() 

을 단순화 할 수있다. 마지막 대문자를 제외 할 경우, 그것은 stack*over*flow

이 접미사 전에 위치를 발견 한 패턴 find(?=suffix)을 사용을 얻을 것입니다 다음과 같은 표현을

Regex.Replace("stackOVERFlow","[A-Z]+(?=[A-Z])","*$0*").ToLower() 

를 사용합니다.

관련 문제