2009-07-13 2 views
2

이것은 단순한 것처럼 보이지 않습니다. 대부분의 사람들은 내가 인터넷에서 찾은 것처럼 정규식 /([A-Z])/_$1/을 생각할 수도 있지만, 나의 특별한 상황은 약간 더 복잡합니다. 내 소스 문자열에 이없는 콘텐츠가 더 많이 포함되어 있습니다. 은의 부분보다 먼저 변환해야합니다. 이 방법은 매개 변수를 누락 물론파스칼 - 케이스 설정자를 밑줄로 구분 된 변수 이름으로 변환

public function setUserId() 

:

는 일반 세터를 생각해 보자. 아마도 이러한 방법이 많이 있습니다. 그 줄을

public function setUserId($user_id) 

으로 변환하고 싶습니다. 그러나 깊이 생각해 보면 그리 간단하지는 않습니다. 그것은 this thread에있는 Andreas_D와 유사하지만 반복적으로 변수 이름을 수정하려고 시도하는 추가 과제가 있습니다 ...

정규식을 사용하면 분명히 분명 할 것 같지만, 아직 완전히 새롭습니다. 어쨌든, 나는 내 검색에서 어디서나이 문제에 대한 적절한 해결책을 찾을 수 없다.

편집 : 물론, 나는 그것을 안전하게 유지하는 "공공 기능"에는 자본이 없다는 것을 알았습니다. 그러나이 검색 & 대체 코드의 블록에 대해 실행됩니다, 그리고 난 "공공 기능"으로 시작 수정 문자열을 보장하고 싶습니다.

답변

2

먼저 함수 정의를 검색 한 다음 각 일치 할 때 함수 이름을 기반으로 매개 변수를 삽입하십시오.

/\b(function\s+set([A-Z]\w*))\b\s*\(\)/g 

이 패턴은 줄 것이다 당신은 function 개의 키워드와 그룹 1의 함수 이름 및 그룹의 함수 이름의 낙타 맡았다 부분 일치 2.

/([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))/g 

이 패턴 것 낙타의 경우를 구성하는 대문자/소문자 순서 앞에 마지막 문자를 찾으십시오.

당신은 너무 여기, 당신이 사용하게 될 어떤 언어를 지정하지 않은 파이썬을 사용하여 데모입니다 :

import re 

pattern1 = re.compile(r'\b(function\s+set([A-Z]\w*))\b\s*\(\s*\)') 
pattern2 = re.compile(r'([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))') 

def fix_setters(code): 
    def replacer(match): 
     var_name = pattern2.sub(r'\1_', match.group(2)).lower() 
     return "%s($%s)" % (match.group(1), var_name) 
    return pattern1.sub(replacer, code) 

마지막 줄 ("return pattern1.sub(replacer, code)")는, 대체 할 텍스트를 생성하는 콜백을 사용 . 대부분의 언어에서 비슷한 기능이 있어야합니다.

파이썬 (버전 3.0 이전)은 형식화에 모듈러스 연산자 ("%")를 사용합니다. 예 : sprintf과 유사합니다. 언어 C.

예 :

>>> s = """\ 
... public function setUserName() { 
... blaha 
... } 
... """ 
>>> print s 
public function setUserName() { 
    blaha 
} 

>>> print fix_setters(s) 
public function setUserName($user_name) { 
    blaha 
} 

>>> 

더 많은 정보 : .NET - How can you split a “caps” delimited string into an array?

+0

굉장 MizardX. 이것은 정확히 내가 필요한 것이고 그것은 훌륭하게 작동합니다. 저는 아직 파이썬을 알지 못합니다 (배우려는 의도가 있습니다 ...)하지만 읽기 쉬운 매우 직관적 인 언어입니다. 테스트 케이스를위한 아주 좋은 선택. – JMTyler

관련 문제