정규 표현식에 주석을 달기위한 일반적인 관행이 있습니까? 인라인 주석은 RegEx의 다른 부분을 참조하거나 모든 표현식에 대한 일반적인 주석입니까?
정규 표현식에 주석을 달기위한 일반적인 관행이 있습니까? 인라인 주석은 RegEx의 다른 부분을 참조하거나 모든 표현식에 대한 일반적인 주석입니까?
답변:
제 생각에는 정규 표현식의 일반적인 아이디어가 무엇인지 간결하게 설명하는 것이 좋습니다. 이것은 다른 개발자 (또는 때로는 자신)를 RegExr 과 같은 파서에 정규식을 복사하여 붙여 넣는 번거 로움을 덜어 줍니다.
이것은 언어 별 답변이지만 질문에 언급 된 언어는 없습니다.
"Dive Into Python" 책 은 Verbose 정규 표현식을 사용하여 주석을 구현할 것을 제안합니다 .
파이썬을 사용하면 자세한 정규 표현식이라고 할 수 있습니다. 장황한 정규 표현식은 다음 두 가지면에서 컴팩트 정규 표현식과 다릅니다.
- 공백은 무시됩니다. 공백, 탭 및 캐리지 리턴은 공백, 탭 및 캐리지 리턴과 일치하지 않습니다. 그들은 전혀 일치하지 않습니다. (자세한 정규 표현식에서 공백을 일치 시키려면 앞에 백 슬래시를 넣어 공백을 이스케이프해야합니다.)
- 주석은 무시됩니다. 장황한 정규 표현식의 주석은 Python 코드의 주석과 같습니다.
#
문자로 시작 하여 줄 끝까지갑니다. 이 경우 소스 코드가 아닌 여러 줄 문자열 내에서 주석이지만 동일한 방식으로 작동합니다.
예:
>>> pattern = """
^ # beginning of string
M{0,4} # thousands - 0 to 4 M's
(CM|CD|D?C{0,3}) # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
# or 500-800 (D, followed by 0 to 3 C's)
(XC|XL|L?X{0,3}) # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
# or 50-80 (L, followed by 0 to 3 X's)
(IX|IV|V?I{0,3}) # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
# or 5-8 (V, followed by 0 to 3 I's)
$ # end of string
"""
>>> re.search(pattern, 'M', re.VERBOSE) 1
소스 및 자세한 내용은 여기
이 방법은 호출자가 패턴이 자세한 형식으로 작성되었다는 것을 알아야하고 그에 따라 호출해야한다는 약간의 단점이 있습니다.
re.compile
을 정의하는 지점에서 사용할 수 있으며 결과 객체 만 저장할 수 있습니다. 이렇게하면 패턴 컴파일 플래그 (포함 re.VERBOSE
)를 패턴 자체와 분리 할 필요가 없습니다.
#
verbose 플래그를 사용 하는 경우 어떻게 일치시킬 수 있습니까? 그건 그렇고 : 소스 링크가 다운 된 것 같습니다.
일반적으로 정규식을 작성하고 정규식의 개별 부분을 설명하지 않고 그 목적이 무엇인지 설명합니다. 그것은 무엇과 왜입니다. 이것은 "내 의견은 어떻게 보여야합니까?"라고 묻는 것과 같습니다. " 코드가하는 일을 쓰지 말고, 코드가하는 일을하는 이유를 쓰십시오. "
// Strip the leading "?" and remove the query parameters "offset=<integer>" & "count=<integer> so we have a pattern of the request"
var search = location.search.substring(1).replace(/offset=[0-9]+?&/g, "").replace(/count=[0-9]+?&/g, "");
코드의 주석을 통해 정규 표현식에 대해 누군가에게 가르치려고하지 않는 한, 각 개별 조각이 무엇을하는지 설명하지는 않습니다. 다른 프로그래머와 함께 작업 할 때 전역 정규 표현식으로 알고 있다고 가정 할 수 있습니다.
정말 정규식을 어떻게 결합하는지에 달려 있다고 생각합니다. 일반적으로 말하자면 실제 정규 표현식 문자열 자체에 주석을 넣는 것은 나쁜 생각이라고 생각합니다 (내가 아는 한 대부분의 시나리오에서는 불가능합니다). 정규식의 특정 부분에 주석을 달아야 할 필요가 있다면 (누군가를 가르치려고합니까?), 각 청크를 별도의 줄로 나눠서 프로그래밍 언어에 대한 일반적인 주석 달기 프로세스를 사용하여 각 줄을 주석 처리하십시오. 그렇지 않으면 pleinolijf의 대답이 꽤 좋습니다.
예:
string myregex = "\s" // Match any whitespace once
+ "\n" // Match one newline character
+ "[a-zA-Z]"; // Match any letter
나는 보통 정규 표현식의 전반적인 목적을 나타내는 이름을 가진 문자열 상수를 정의합니다.
예를 들면 다음과 같습니다.
const string FloatingPointNumberPattern = @"[-+]?[0-9]*\.?[0-9]+";
이 상수 위에 주석을 추가하여 설명을 제공 할 수 있지만 일반적으로 상수 이름 자체로 충분해야합니다.
일부 시나리오에서 개발자는 일반적인 도메인 외부의 텍스트와 일치시키기 위해 정규식을 사용하고있을 수 있습니다. 원래 개발자는 반복 프로세스를 통해서만 발견되었을 수있는 다양한 에지 사례를 캡처하는 많은 반복을 거쳤을 수 있습니다. 따라서 후속 개발자는 일반적인 경우를 알고 있더라도 원래 개발자가 처리 한 많은 경우를 알지 못할 수 있습니다.
이러한 경우 변형의 예를 문서화하는 것이 좋습니다. 이 문서의 위치는 양에 따라 달라질 수 있습니다 (예 : 코드에서 반드시 필요한 것은 아님).
접근하는 한 가지 방법은 미래의 개발자가 정규 표현식의 작동 방식과 같은 기본 지식 만 가질 것이지만 반드시 (1) 정규 표현식을 개발하기 전에 반드시 알고있을 필요는없는 지식은 아님을 가정하는 것입니다. 미래 개발자 또는 (2) 개발 중에 얻은 지식 (예 : 발견 된 최신 사례).
예를 들어, 개발 중에 "아, X가이 형식을 취할 수 있다는 것을 몰랐습니다"라고 말하면 문서화 할 가치가 있습니다 (그리고 아마도 그 변형을 처리하는 정규식의 일부일 수도 있습니다).
주석은 코드에서 명확하지 않은 유용한 정보를 추가해야합니다.
마지막주기마다 필요한 응용 프로그램은 거의 없습니다. 대규모 데이터 세트와 패턴을 일치시키는 경우 더 나은 방법이있을 수도 있지만 그렇지 않을 수도 있지만 대부분의 경우 추가 실행 시간이 그다지 중요하지 않습니다.
그리고 다음 사람이 귀하의 코드를 발견하고 6 개월 안에 버그를 고칠 수 있다는 것을 기억하십시오. 어떻게해야했는지 기억할 방법이 없습니다.