문제

이것은 보이는 것만 큼 단순하지 않습니다. 대부분의 사람들은 동정인을 생각하고있을 것입니다 /([A-Z])/_$1/ 인터넷 전체에서 발견 한 것처럼 내 특정 상황은 약간 더 복잡합니다. 내 소스 문자열에는 더 많은 내용이 포함되어 있습니다 ~하지 않다 I의 일부보다 먼저 변환하고 싶다 하다.

일반 세터를 고려하십시오.

public function setUserId()

물론이 메소드에는 매개 변수가 없습니다. 아마도이 방법들 중 많은 방법이있을 것입니다. 그 줄을 변환하고 싶습니다

public function setUserId($user_id)

고려해야 할 다소 간단하지만 더 깊이 숙고하는 것처럼 간단하지는 않습니다. Andreas_d가있는 것과 비슷합니다 이 스레드, 그러나 변수 이름을 반복적으로 수정하려는 추가 도전과 함께 ...

아마도 정규 표현식을 사용하여 명백한 것이 될 것입니다. 그러나 나는 여전히 그들과 함께 아주 새롭습니다. 어느 쪽이든, 나는 검색의 어느 곳 에서나이 문제에 대한 괜찮은 해결책을 찾을 수 없습니다.

편집 : 물론, 나는 "공공 기능"에 수도가 없다는 것을 알고 있습니다. 그러나이 검색 및 대체는 코드 블록에 대해 실행되며 수정 된 문자열을 확인하고 싶습니다. 시작합니다 "공개 기능"으로.

도움이 되었습니까?

해결책

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

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

이 패턴은 당신에게 당신에게 일치합니다 function-그룹 1의 keyword 및 함수 이름 및 그룹 2의 함수 이름의 낙타 부분.

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

이 패턴은 낙타 케이스를 구성하는 상위 사례/소문자 시퀀스 앞에 마지막 문자를 찾을 수 있습니다.

사용할 언어를 지정하지 않았으므로 여기에는 Python을 사용하는 데모가 있습니다.

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- 구분 된 문자열을 배열로 어떻게 분할 할 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top