정규식 주석 달기


11

정규 표현식에 주석을 달기위한 일반적인 관행이 있습니까? 인라인 주석은 RegEx의 다른 부분을 참조하거나 모든 표현식에 대한 일반적인 주석입니까?


2
하지만 더 구체적이어야합니다. 예를 들어 Bash는 인라인 주석을 지원하고 Python은 자세한 정규 표현식을 제공합니다.
sakisk

6
정규 표현식에 대한 나의 경험 규칙은 다음과 같습니다. 정규 표현식에 주석을 달아야하는 경우에는 너무 복잡합니다.
zzzzBov

1
그리고 항상이 링크를 포함하십시오 : regexcrossword.com
Kieveli

나는 당신이 그것을 언급해야한다면, 너무 복잡하다는 데 반드시 동의하지는 않습니다. 복잡한 정규 표현식은 여전히 ​​많은 눈부신 명령 코드를 저장할 수 있습니다. 적절한 설명 변수 이름을 사용하여 정규식을 할당하십시오. 여전히 명확하지 않은 경우 간단한 설명을 사용하여 원래 의도 를 정규 표현식 뒤에 전달하십시오 .
Craig

답변:


10

제 생각에는 정규 표현식의 일반적인 아이디어가 무엇인지 간결하게 설명하는 것이 좋습니다. 이것은 다른 개발자 (또는 때로는 자신)를 RegExr 과 같은 파서에 정규식을 복사하여 붙여 넣는 번거 로움을 덜어 줍니다.


2
개발자가 정규식 서번트가 아닌 한 RegExr은 어쨌든 발생할 것입니다. 그러나 나는 일반적인 설명을 제공하는 것에 동의합니다. 그것이 내 정규식으로하는 일입니다.
Robert Harvey

3
+1 : 더 자세한 내용은 정규 표현식에서 크래쉬 코스가 될 수 있습니다.
Matt

이 답변과 @zzzzBov 의견은 의미가 있습니다.
m0nhawk

1
정규 표현식에 대한 지루한 검토가 번거 로움을 덜어 줄뿐만 아니라 특히 원래 프로그래머가 정규 표현식 자체가 전나무 시간을 잘못 틀렸을 가능성이 있다는 점을 감안할 때 원래 프로그래머의 의도를 분명히합니다. 그럼에도 불구하고, 많은 경우에 정규 표현식을 좋은 변수 이름에 할당하는 것은 적절한 의도의 문서를 제공하는 데 큰 도움이 될 수 있습니다.
Craig

9

이것은 언어 별 답변이지만 질문에 언급 된 언어는 없습니다.

"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

소스 및 자세한 내용은 여기

이 방법은 호출자가 패턴이 자세한 형식으로 작성되었다는 것을 알아야하고 그에 따라 호출해야한다는 약간의 단점이 있습니다.


2
패턴을 변수에 저장하는 대신 패턴 re.compile을 정의하는 지점에서 사용할 수 있으며 결과 객체 만 저장할 수 있습니다. 이렇게하면 패턴 컴파일 플래그 (포함 re.VERBOSE)를 패턴 자체와 분리 할 필요가 없습니다.
존 Bartholomew

정말 유용한 답변, 감사합니다! 그러나 #verbose 플래그를 사용 하는 경우 어떻게 일치시킬 수 있습니까? 그건 그렇고 : 소스 링크가 다운 된 것 같습니다.
winklerrr

좋아, #문자 클래스 안에있을 때 문자 그대로 일치시킬 수 있습니다 : [#](source : docs.python.org/3/library/re.html#re.X )
winklerrr

8

일반적으로 정규식을 작성하고 정규식의 개별 부분을 설명하지 않고 그 목적이 무엇인지 설명합니다. 그것은 무엇과 왜입니다. 이것은 "내 의견은 어떻게 보여야합니까?"라고 묻는 것과 같습니다. " 코드가하는 일을 쓰지 말고, 코드가하는 일을하는 이유를 쓰십시오. "

// 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, "");

코드의 주석을 통해 정규 표현식에 대해 누군가에게 가르치려고하지 않는 한, 각 개별 조각이 무엇을하는지 설명하지는 않습니다. 다른 프로그래머와 함께 작업 할 때 전역 정규 표현식으로 알고 있다고 가정 할 수 있습니다.


3
당신은 놀라게 될 것입니다 ...
매트

6

정말 정규식을 어떻게 결합하는지에 달려 있다고 생각합니다. 일반적으로 말하자면 실제 정규 표현식 문자열 자체에 주석을 넣는 것은 나쁜 생각이라고 생각합니다 (내가 아는 한 대부분의 시나리오에서는 불가능합니다). 정규식의 특정 부분에 주석을 달아야 할 필요가 있다면 (누군가를 가르치려고합니까?), 각 청크를 별도의 줄로 나눠서 프로그래밍 언어에 대한 일반적인 주석 달기 프로세스를 사용하여 각 줄을 주석 처리하십시오. 그렇지 않으면 pleinolijf의 대답이 꽤 좋습니다.

예:

string myregex = "\s" // Match any whitespace once
+ "\n"  // Match one newline character
+ "[a-zA-Z]";  // Match any letter

4

나는 보통 정규 표현식의 전반적인 목적을 나타내는 이름을 가진 문자열 상수를 정의합니다.

예를 들면 다음과 같습니다.

const string FloatingPointNumberPattern = @"[-+]?[0-9]*\.?[0-9]+";

이 상수 위에 주석을 추가하여 설명을 제공 할 수 있지만 일반적으로 상수 이름 자체로 충분해야합니다.


1
약이 대답처럼 한 여분의 것은 내가 이상 한 자리에 사용됩니다 경우, 의도가 있다는 것입니다 없습니다 그것을 언급 할 망각을 - 너무 주위를 수행 할 수 있습니다.
J Trana

3

일부 시나리오에서 개발자는 일반적인 도메인 외부의 텍스트와 일치시키기 위해 정규식을 사용하고있을 수 있습니다. 원래 개발자는 반복 프로세스를 통해서만 발견되었을 수있는 다양한 에지 사례를 캡처하는 많은 반복을 거쳤을 수 있습니다. 따라서 후속 개발자는 일반적인 경우를 알고 있더라도 원래 개발자가 처리 한 많은 경우를 알지 못할 수 있습니다.

이러한 경우 변형의 예를 문서화하는 것이 좋습니다. 이 문서의 위치는 양에 따라 달라질 수 있습니다 (예 : 코드에서 반드시 필요한 것은 아님).

접근하는 한 가지 방법은 미래의 개발자가 정규 표현식의 작동 방식과 같은 기본 지식 만 가질 것이지만 반드시 (1) 정규 표현식을 개발하기 전에 반드시 알고있을 필요는없는 지식은 아님을 가정하는 것입니다. 미래 개발자 또는 (2) 개발 중에 얻은 지식 (예 : 발견 된 최신 사례).

예를 들어, 개발 중에 "아, X가이 형식을 취할 수 있다는 것을 몰랐습니다"라고 말하면 문서화 할 가치가 있습니다 (그리고 아마도 그 변형을 처리하는 정규식의 일부일 수도 있습니다).


2

주석은 코드에서 명확하지 않은 유용한 정보를 추가해야합니다.

  1. 코드 자체 또는 주석에서 요구 사항 레벨에서 표현식이 수행해야하는 작업을 쉽게 이해할 수 있도록하십시오. 이 표현의 의도는 이메일 주소를 확인하거나 캐나다 전화 번호를 선택하는 것입니다.
  2. 식이 실제로하고있는 것, 즉식이 평가하는 것을 쉽게 이해할 수 있도록하십시오. 먼저 표현식을 분할하여 명확하게 해보십시오. 먼저 모든 하이픈을 확인한 다음 모든 숫자를 제거한 다음 중간 값을 보유하는 변수로 두 부분 표현식을 작성하면 훨씬 쉽게 읽을 수 있으며 독자는 한 번에 한 단계 씩 논리를 밟을 수 있습니다. (SE에 대한 질문에 대한 누군가가 비트 조작 '>>'을 포함하는 오래된 코드를 해독하려고 시도하고 코드가 실제로하는 것뿐만 아니라 어떻게 응답 하는지를 나타내는 특정 플래그가 설정되어 있는지 확인하는 유명한 답변이 있습니다. 질문의 authour는 앞으로 이런 종류의 코드를 해체해야합니다.

마지막주기마다 필요한 응용 프로그램은 거의 없습니다. 대규모 데이터 세트와 패턴을 일치시키는 경우 더 나은 방법이있을 수도 있지만 그렇지 않을 수도 있지만 대부분의 경우 추가 실행 시간이 그다지 중요하지 않습니다.

그리고 다음 사람이 귀하의 코드를 발견하고 6 개월 안에 버그를 고칠 수 있다는 것을 기억하십시오. 어떻게해야했는지 기억할 방법이 없습니다.


1

의미있는 이름을 가진 별도의 클래스로 RegEx를 추출하십시오. 그런 다음 자동화 된 테스트로 코드를 문서화했습니다.

이것은 보장합니다

  • 코드가 실제로 작동하는지-코너 케이스에서도
  • 빠른 "버그 수정"이 많은 코너 케이스를 망칠 수 없도록합니다.
  • 역 추적이 비활성화 된 경우 최적화를 문서화 할 수 있음

당연히 클래스는 여러 정규 표현식을 호스팅 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.