[] 의 영문 문 자 를 삭제 합 니 다.

7627 단어 문자
최근 정보 과학기술 대학 에 지 넷 취업 반 과정 을 올 렸 습 니 다. 점심 에 한 정보 과학기술 대학 선생님 이 정규 표현 식 에 관 한 문 제 를 물 었 습 니 다. 문 제 는 대체적으로 이렇게 묘 사 했 습 니 다. 그 안에 중국어 와 영어 의 혼합 내용 이 있 고 중간 에 몇 쌍 의 괄호 (괄호) 가 포함 되 어 있 습 니 다. 지금 은 필요 합 니 다.괄호 안에 있 는 모든 영문 문 자 를 제거 하고 다른 데 이 터 를 보존 하 는 것 입 니 다. 저 는 딱 봐 도 완성 할 수 있다 고 생각 했 습 니 다. 그런데 손 쉽게 쓰 니까 문제 가 있 습 니 다. 수학 출신 의 원인 일 수도 있 습 니 다. 항상 문 제 를 전면적으로 쓰 려 고 합 니 다. 저 는 점심 을 먹 을 때 어떻게 해 야 좋 을 지 생각 하고 있 습 니 다. 여기 서 저 에 게 이 문 제 를 생각 하 는 방향 을 제시 합 니 다.모두 에 게 약간의 깨 우 침 을 주 었 는 지 보 자.
 
화 귀 사상 수학 에는 매우 중요 한 사상 이 있 는데 바로 '화 귀' 사상 이다. 무엇이 화 귀 입 니까?쉽게 말 하면 복잡 한 문 제 를 귀납 적 으로 정리 하고 이 를 간단 한 문제 의 조합 으로 만 든 다음 에 간단 한 문제 가 해결 되 고 복잡 한 문제 도 해결 된다. 어떤 친 구 는 '수학 이 머리 가 아 픈 것 을 보고 나 에 게 무슨 화 귀 사상 을 말 하 느 냐' 고 말한다. 사실은 그렇지 않다. 단지 화 귀 사상 이라는 이름 이 무섭다. 수학 사상 이 야.사실 그녀 는 매우 기초적인 사람 이다. 왜냐하면 우 리 는 매일 이 사상 을 사용 하고 있 기 때문이다. 생활 속 의 예 를 들 어 슈퍼마켓 의 상품 품질 과 가격 이 좋 은 지 나 쁜 지 알 고 싶다. 어떻게 연구 해 야 하 는가?분명히 이것 은 우리 가 하나하나 검사 할 방법 이 없 지만 우 리 는 볼 수 있 고 비교 할 수 있다. 만약 에 이 슈퍼마켓 이 항상 사람 이 많 고 소비자 의 신고 도 적다 면 우 리 는 결론 을 내 릴 수 있다. 이 슈퍼마켓 은 괜찮다. 예 를 들 어 대상 을 대상 으로 하 는 개념 인 C \ # 에서 계승 하 는 것 이 전달 성 이 있다 는 것 을 어떻게 이해 합 니까?사실은 간단 하 다. 상속 때문에 자 류 는 아버지 류 의 구성원 을 포함 하고 있다. 그러면 계속 손자 류 는 자 류 를 계승 하면 자 류 의 구성원, 즉 손자 류 는 아버지 류 의 구성원 을 포함 하기 때문에 결론 을 내 렸 다. 파생 류 는 모두 기본 적 인 구성원 을 가지 고 자 연 스 럽 게 전달 성 이 잘 이해 된다.
 
문제 화 는 그렇게 많이 말 한 것 이 이 문 제 를 해결 하 는 것 과 무슨 관계 가 있 습 니까?분명히 나 는 이 문 제 를 해결 하기 위해 화 귀 사상 을 사용 했다. 관건 은 이 문제 에 어떤 난점 이 있 느 냐 는 것 이다.예 를 들 어 문자열 이 있 습 니 다.
1 string str = "abc[ abc ]abc";

문자열 에 있 는 "[abc 안녕하세요]" 의 영문 문자 "abc" 를 제거 하여 문자열 을 바 꾸 려 고 합 니 다.
1 string str = "abc[  ]abc";

정규 표현 식 을 사용 하면
1 string str = Regex.Replace(str, @"(\[ )[a-zA-Z]+( \])", "$1$2");

물론 이곳 의 해답 은 결코 유일한 것 이 아니 기 때문에 제 가 생각 한 방법 일 뿐 입 니 다. 그러나 관건 은 이 상황 이 매우 특수 하 다 는 것 입 니 다. 우선, 괄호 '[]' 에서 한자 가 양쪽 에 있 는 것 이 아니 라 안녕하세요 가 아 닙 니 다.그 다음 에 중간 에 꼭 한 줄 의 영문 자모 만 있 는 것 이 아니다. 예 를 들 어 '너 abc 좋 은 abc 야' 일 수도 있다. 그러면 이때 그다지 효과 가 없다. 그러면 여기 서 문 제 는 바로 1. 괄호 안에 몇 개의 남자 블록 과 몇 개의 영어 블록 이 있 는 지 확실 하지 않다 는 것 이다.2. 괄호 안에 영문 과 한자 의 배열 방식 이 명확 하지 않다.
그러면 문 제 를 한 번 돌리 면 처리 하기 쉽다.
한자 의 양쪽 형 은 괄호 안의 영문 자 모 를 없 애 는 것 이 문제 이기 때문에 괄호 안의 양쪽 끝 이 무엇 이 든 C \ # 문 구 를 사용 할 수 있다.
1 string str = Regex.Replace(str, @"(\[)[a-zA-Z]*(.+?)[a-zA-Z]*(\])", "$1$2$3");

문자열 의 중국 괄호 양쪽 을 한자 로 만 듭 니 다. 즉, 모든 문자열 은 다음 과 같은 모델 로 나 눌 수 있 습 니 다.
... [중.. 중]...
 
[중 a 중 a 중] 형.
문자열 을 '한자 양변 형' 으로 바 꾼 후에 문 제 는 양 끝 한자 에 몇 개의 인용문 문자 가 있 는 지 명확 하지 않다 는 것 이다. 그러나 스스로 분석 하고 오른쪽 한 자 를 없 애 면 문자열 은 문자열 세 션 '중 a' 의 반복 적 인 순환 조합 으로 변 할 것 이다. 즉, '중 a', '중 a 중 a', '중 a 중 a 중 a', '"[중 a 중 a 중] 형" 문자열 을 잘 해결 하면 다른 상황 은 순환 으로 해결 할 수 있 습 니 다. 첫 번 째 단 계 는 왼쪽 에서 오른쪽으로 첫 번 째 영어 (존재 여 부 를 판단 해 야 합 니 다) 를 순서대로 제거 합 니 다. 예 를 들 어 하나의 문자열 "[중 a 중 a 중 a 중]" 정규 표현 식 을 통 해 "[중 a 중 a 중]" 으로 바 꿀 수 있 습 니 다. C \ # 문 구 를 사용 할 수 있 습 니 다.
1 if(Regex.IsMatch(str, @"\[[^\]]+?[a-zA-Z]+[^\]]+\]"))
2 {
3 string str = Regex.Replace(str, @"(\[[^\]]+?)[a-zA-Z]+([^\]]+\])", "$1$2");
4 }

두 번 째 단 계 는 간단 합 니 다. 나머지 는 '[중 a 중] 형' 이 남 을 때 까지 반복 되 는 것 입 니 다. 실제로 이 모드 문자열 이 남 았 을 때 위의 방법 을 사용 하면 중간 영 어 를 제거 할 수 있 습 니 다.
 
일치 하 는 규칙 을 분석 해 보 세 요. 실제로 문 제 를 해 결 했 습 니 다. 제 가 왜 정규 표현 식 을 이렇게 썼 는 지 설명 하 겠 습 니 다. 저 는 마지막 으로 일치 하 는 것 을 예 로 들 겠 습 니 다. 
1 string str = "a[ a ]a";
2 if(Regex.IsMatch(str, @"\[[^\]]+?[a-zA-Z]+[^\]]+\]"))
3 {
4 string str = Regex.Replace(str, @"(\[[^\]]+?)[a-zA-Z]+([^\]]+\])", "$1$2");
5 }

분석: 1. 이때 if 판단 에서 IsMatch 는 IsMatch 의 정규 표현 식 과 일치 하 는 지 판단 합 니 다. "@" \ [^ \]] +?[a - zA - Z] + [^ \]] + \] "는 중 괄호 '[' 로 시작 한 다음 중간 에 중 괄호 가 끝 나 는 문자 '] 가 있 는 것 을 허용 하지 않 는 다 는 뜻 이 며, 탐욕 모드 를 취소 하여 뒤의' [a - zA - Z] + '를 가능 한 한 첫 번 째 영문 자모 와 일치 시 켰 다. 여 기 는 str 의' [중 a '와 일치 하고 나머지' [^ \] + \] '는 첫 번 째 인용문 자모 가 끝 난 후의 모든 문자 와 일치 하 다.그리고 끝 나 는 중 괄호 "]" 입 니 다. 따라서 돌아 오 는 것 은 true 입 니 다. 2. if 의 일치 가 바 뀌 기 시작 하면 바 꾸 기 가 쉽 습 니 다. Replace 방법 중의 정규 표현 식 의 앞 뒤 두 그룹 은 각각 "[중" 과 "중]" 과 일치 하기 때문에 "$1 $2" 는 중간 에 있 는 인용문 자 모 를 바 꿉 니 다. 마지막 으로 일치 하지 않 는 경우, 예 를 들 어 교체 "입 니 다.[중 a 중 a 중] ", 조 1 은" [중 ", 조 2 는" 중 a 중] "과 일치 합 니 다. 왼쪽 에 있 는 첫 번 째 영 어 를 바 꾸 었 을 뿐 입 니 다.
 
통합 결과
앞의 분석 을 통 해 중 괄호 안의 영 어 를 제거 하려 면 사용 할 수 있 는 일반적인 사 고 는 - > 중 괄호 안의 앞 뒤 영문 자 모 를 먼저 제거 하고 - > 순환 을 이용 하여 왼쪽 에서 오른쪽으로 한 조 의 영문 문 자 를 순서대로 제거 하고 영문 문자 까지 제거 합 니 다.
앞의 토론 과 결합 하여 방법 을 제시 하 다.
1 public static string MyReplace(string str)
2 {
3 str = Regex.Replace(str, @"(\[)[a-zA-Z]*(.+?)[a-zA-Z]*(\])", "$1$2$3");
4 while (Regex.IsMatch(str, @"\[[^\]]+?[a-zA-Z]+[^]]+\]"))
5 {
6 str = Regex.Replace(str, @"(\[[^\]]+?)[a-zA-Z]+([^\]]+\])", "$1$2");
7 }
8 return str;
9 }

그러나 생각해 볼 만 한 것 은 이곳 이 반드시 절대적 인 해결 방안 이 아니 라 제 생각 에 따라 더 좋 은 방법 이 나 올 것 입 니 다. 여기 서 저 는 문 제 를 생각 하 는 방법 을 제시 하고 해결 방안 을 만 들 었 을 뿐 입 니 다.
2012 년 3 월 23 일 금요일 장 쿤

좋은 웹페이지 즐겨찾기