2012-06-06 1 views
2

첫 번째 및 마지막 문자를 제외한 모든 모음을 모음에서 제거하려고합니다. 나는 2 개의 표현으로 시도했지만 헛되이 2 가지 방법을 사용했다. 나는 그들을 아래에 묘사했다. 아무도 이것에 대한 정규 표현식을 가지고 있습니까?C# - 첫 번째 및 마지막 문자 이외의 문자열에서 모음을 제거하는 정규식

원래 문자열 - 소스 = apeaple

정규식 후 - source_modified = 사과 (이 예상되는 것입니다)

나는 표현 ([a-zA-Z])[aeiouAEIOU]([a-zA-Z])을 시도했지만이 표현뿐만 아니라 문자를 반복 제거하고 있습니다.

 
Regex reg = new Regex("([a-zA-Z])[aeiouAEIOU]([a-zA-Z])"); 
string source_modified = reg.Replace(source, ""); 

원래 문자열 - - 제가

코드를 사용하는 상기 식을 적용하면 그래서 다음 일어나고 소스 = apeaple

코드 실행 후 - source_modified = aple (반복 문자 삭제)

코드 사용 - string source_modified = Regex.Replace(source, "([a-zA-Z])[aeiouAEIOU]([a-zA-Z])", "$1" + "$2");

원래 문자열 - 소스 = apeaple

코드 실행 후

- source_modified = apaple (단지 1 모음 제거 들어간)

또한 ([a-zA-Z])[aeiouAEIOU]*([a-zA-Z]) 시도하지만이 아닌 모든 단지 하나의 모음을 제거한다. source_modified = ""(모든 문자입니다 -

 
Regex reg = new Regex("([a-zA-Z])[aeiouAEIOU]*([a-zA-Z])"); 
string source_modified = reg.Replace(source, ""); 

원래 문자열 - - = apeaple

코드 실행 후 소스 내가

코드가 사용 위의 식을 적용 할 때 그래서 다음과 같은 일이 일어나고있다

코드 사용) 삭제 - string source_modified = Regex.Replace(source, "([a-zA-Z])[aeiouAEIOU]*([a-zA-Z])", "$1" + "$2");

원래 문자열 - 소스 = apeaple

코드 실행 후 - 소스 수정 됨 = apeple

도와주세요! 미리 감사드립니다!

감사합니다,

사마르

+0

기다림 - 첫 번째 및 마지막 문자를 제외한 모든 모음을 제거하려는 경우 ** apeaple -> apeple ** is wrong! ** apeaple -> apple **, 아니요? – Ani

+0

시작과 끝을 고정해야합니다.^$. – Paparazzi

+1

RegEx는 짐작할 수없는 게임입니다. http://www.radsoftware.com.au/regexdesigner/와 같은 테스트 및 학습에 도움이되는 GUI가 있습니다. – banging

답변

6

당신은

(?<!^)[aouieyAOUIEY](?!$) 

C 번호가 지원하고

string resultString = null; 
try { 
    resultString = Regex.Replace(subjectString, "(?<!^)[aeui](?!$)", ""); 
} catch (ArgumentException ex) { 
    // Syntax error in the regular expression 
} 

이 업데이트 TWRCole 나를 알리는 1

가 있다는 것을 매우 강력하므로 같은 일부 lookaround 필요 영어의 특별한 규칙 ("이것은 내부 'Y'가 자음으로 사용된다 "Anyanka '')와 같은 단어

다음 변경 부정적 예측 기법 사용 이렇게해야

(?<!^)([aouie]|y(?![aouie]))(?!$) 

이번에 정규식 개질제 활성화 그런 대문자와 소문자를 구별하지 않기 때문에, 정규 표현식이 원문보다 단순 해집니다.

ay 다음에 y가 계속 나오면 y는 자음을 의미하므로 (yu ... 같은 단어가 있음) yy가 사라져서는 안됩니다. 마지막 문자 클래스에도 나열되어 있습니다.

(?<!^)([aouie]|y(?![aouiey]))(?!$) 

나는 C#을 사용하여 lookaround 기술을 잘 지원하는 정규 표현식으로 반복합니다.

+0

이것은 아름답게 작동하고 있습니다 .. !! 모음의 다른 조합으로 확인해야하지만 괜찮다고 생각합니다. .. !! 대단히 감사합니다..!! :) – samar

+0

내부 "y"가 자음으로 사용되는 "Anyanka"와 같은 단어에는 작동하지 않습니다. 모음 'y'를 찾으려면 모음 뒤에 오는 'y'를 제거해야합니다. –

+0

@ T.W.R.Cole 나는 영어와 같은 규칙에 익숙하지 않았다. 나는 그것을 지원하기 위해 나의 대답을 업데이트했다. – buckley

7

그렇다면, 왜, 모음을 제거 1, 마지막 문자를 제거하지하고 다시 꿰매?

string sWord = "apeaple"; 
char cFirst = sWord[0], cLast = sWord[sWord.length-1]; 

sWord = sWord.substring(1, sWord.length -2); 

sWord = cFirst.ToString() + 
     Regex.Replace(sWord , "[aouiyeAOUIYE]", String.Empty) + 
     cLast.ToString(); 
+0

이것은 확실히 유효한 해결책이지만, 조금 더 깔끔하기 때문에 버클리의 것이 더 낫다. (비록 어색한 정규 표현식을 가지고 있지만). 이것은 정규 표현식에 너무 익숙하지 않은 OP와 자신이하는 일에 대해서는 아마 가장 좋습니다. – Chris

+0

@Shai; 이것은 좋은 옵션처럼 보입니다. 그러나 이것은 아마도 해결 방법입니다. 이보다 더 좋은 해결책은 ?? – samar

+0

@samar, 버클리의 대답을 보라. 정규식을 사용하여 하나의 라이너 (거의 거의)가 작동한다. 받아 들여야한다. – Shai

0

적어도 하나의 문자로 문자열을 시작하고 모음을 찾은 다음 적어도 하나의 문자로 문자열을 끝내야합니다. 시도 : 경우

(.+)[aeiouAEIOU](.+) 
+0

이것은 많은 도움이되지 않을 것 같습니다 ... 만약 당신이'$ 1 $ 2'로 대체한다면 테스트에서 옳은 일을하지 않습니다 ... 당신이 nothign으로 대체한다면 물론 모든 것을 제거합니다. . – Chris

+0

어떤 결과가 있습니까? –

+0

내가 정확히 기억한다면 중간에서 한 캐릭터를 벗겨 내서 내가 기대했던 것만 큼 진리가 나는 것입니다. 왜, 어떤 결과를 얻고 있습니까? – Chris

0

혹시 두 개 이상의 단어로 구성 문자열에서 개별 단어에 그것을 적용 할, \B[AEIOUaeiou]\B는 시도 가치가있을 수도 있습니다. \B은 단어 경계가 아닙니다. 즉 인접한 두 문자가 모두 단어 문자이거나 단어가 아닌 문자입니다. 후자의 경우는 두 위치 사이에 모음이 있으면 분명히 불가능합니다.

물론 하나의 단어만으로 구성된 문자열에도 적용됩니다.

관련 문제