2008-10-23 3 views
11

내 개발자 중 한 명이 RegexBuddy를 사용하여 레거시 코드를 해석하는 데 도움을 시작했습니다. 이는 완전히 이해하고 지원하는 용도입니다. 무엇이 날 우려 새로운 코드를 작성하는 정규식 도구를 사용하고 있습니다. 우리 팀에서 새로운 코드를 사용하는 것을 실제로 막았습니다. 두 따옴표는 마음에 와서 ". 내가, 내가 정규 표현식을 사용합니다 알고있다"는 문제에 직면했을 때RegexBuddy와 같은 정규식 도구가 좋은 아이디어입니까?

어떤 사람들, 생각 이제 그들은 두 가지 문제가 있습니다. - 제이미 자윈 스키

그리고 :

디버깅 첫번째 장소에있는 코드를 작성하는만큼 열심히 두 배입니다. 따라서 코드를 으로 가능한 한 똑똑하게 작성하면 정의로는 을 디버깅 할만큼 똑똑하지 않습니다. - 브라이언 커니 핸

내 문제는 각각 (입니다 :) 도구가 가능 정말 필요하지 않는 복잡한 정규 표현식을 사용하여 문제를 해결할 수 있도록 하소서

  • . (this question 참조).

  • 정규식 도구를 사용하는 한 명의 개발자가 정규식을 작성하지 않아도됩니다 (주석이있는 경우에도) 정규식 도구가 없거나 사용법을 알고있는 사람은 누구도 관리 할 수 ​​없습니다.

정규식 도구의 사용을 장려하거나 권장하지 않습니까? 특히 새 코드를 작성하는 것이 좋습니다? 나의 우려는 정당한가? 아니면 나는 편집증 적이냐?

+0

는 왜이 유지 될 수 있을까? 가장 복잡한 정규 표현식조차도 15 초 동안 그것을 살펴봄으로써 알아낼 수 있습니다 !!! 나는 정규식을 본 적이 없지만 의미가 파싱 될 수 없다는 것을 그렇게 모호하다. – stephenbayer

+2

정신적으로 15 초 만에 어떤 정규 표현식을 파싱 할 수 있다면, 당신에게 도움이되는 툴이 필요 없다는 것이 나에게 발생한다. 이것은 내 질문에 대한 좋은 대답이다. –

+1

내가 말하는 것은 정규 표현식의 복잡성이 크게 과장되어 있다는 것입니다. 그들은 그것을 사용하지 않는 사람들에게는 어렵지만, 당신이 그들을 이해하고 나면, 당신이 블로그에 대한 코멘트를 읽는 것처럼, 그것을 읽을 수 있습니다. 그것들을 모르는 개발자는 regex의 – stephenbayer

답변

45

불완전한 프로그래밍은 거의 도구의 결함이 아닙니다. 개발자가 도구를 이해하지 못하는 것은 잘못입니다. 나에게 이것은 목수가 스크류 드라이버를 소유해서는 안되며 손톱이 더 적절한 곳에 나사를 사용할 수 있기 때문입니다.

+0

거의 내 답장에서이 비유를 사용했습니다. – glenatron

+1

나는 이것을 게시하는 것을 괴롭히지 않을 것이며, 단지 이것을 상상해보십시오. – Kris

+0

와우 ... 대표자를 축하합니다 (최대 200 일/일). – Keng

4

개발자가보다 효율적으로 사용할 수있는 도구를 사용하는 것이 좋습니다. 그런데, 그들이 오른쪽 도구를 사용하고 있는지 확인하는 것이 중요합니다. 정규 표현식을 사용하는 것이 적절한시기와 강력한 방법이 요청 된 경우 (less|more)에 대해 모든 팀 구성원을 교육해야합니다. 마지막으로, 차세대 개발자가이를 유지 관리 할 수 ​​있도록 모든 정규 표현식 (IMHO)을 철저히 설명해야합니다.

1

정규식 테스트 도구는 매우 중요합니다. 나는 항상 그들을 사용한다. 제 직업은 특히 정규식이 무겁지 않습니다. 따라서 지식베이스를 구축 할 때 뉘앙스를 안내하는 프로그램이 있어야합니다.

4

정규식에 대해 왜 그렇게 많은 어려움이 있는지 나는 잘 모르겠다.

예, 누군가 다른 사람이 쓸 수있는 코드의 일부처럼 정확하게 어수선하고 모호해질 수 있지만 코드에 비해 장점이 있습니다. 형식적으로 지정된 문자열 집합을 표현합니다 (적어도 확장 기능이있는 경우 귀하의 언어). 코드 집합에서 허용되는 문자열 집합을 이해하려면 코드를 "리버스 엔지니어링"해야합니다.

물론 재귀와 goto의 경우 이미 정규 표현식을 사용하지 않았지만 좋은 대안이있는 경우에만 나에게 정당화 될 수 있습니다.

문자열 집합을 캡처하려고하는 복잡한 수제 함수보다 한 줄 정규식 코드를 유지하는 편이 더 좋습니다.

정규식을 이해하고 (또는 새로운 것을 작성하는) 도구를 사용할 때 나는 완벽하다고 생각합니다! 만약 누군가가 도구로 그것을 쓴다면, 다른 누군가가 그것을 도구로 이해할 수 있습니다! 사실, 당신이 걱정한다면, RegexBuddy와 같은 도구를 보게 될 것입니다. 정규 표현식 때문에 코드가 유지 보수되지 않을 수 없다는 것입니다.

+0

안녕하세요 Remo, 명확히하기 위해 정규 표현식을 권장하지 않습니다. 당신이 말했듯이, 한 줄 정규식은 종종 20 줄의 코드가 필요할 수도있는 문제에 대한 최선의 해결책입니다. RegexBuddy 외부에서 해독 할 수없는 거대한 괴물 같은 정규 표현식입니다. :) –

+0

코드 검토를 수행합니까? 그렇다면 문제가되는 정규식을 잡을 수 있습니다. – EBGreen

+0

당신이 걱정하는 거대한, 괴물 같은 정규 표현식을 대체하기 위해 어떤 종류의 코드가 필요합니까? ignore pattern whitespace 옵션으로 분리 된 좋은 주석을 가진 큰 정규식은 동등한 substring/indexof 솔루션보다 훨씬 이해하기 쉽습니다. – Kibbee

1

정규 표현식은 많은 텍스트 처리 문제를 해결하는 훌륭한 도구입니다. 다른 팀원들이 이해할 수없는 정규 표현식을 쓰는 팀원이 있다면 나머지 사람들에게 그들이 어떻게 일하고 있는지 가르쳐 주시지 않겠습니까? 위협보다는 오히려 이것을 기회로 생각할 수 있습니다. 그런 식으로 미지의 세계에 위협을 느낄 필요가 없으며 무기고에 또 다른 매우 유용한 도구가 생깁니다.

Zawinski의 의견은 재미 있지만 glib이지만 근본적으로 무지와 글쓰기의 표현입니다. 정규 표현식은 코딩 전체가 아니므로 나는 그 인용문에 대해 걱정하지 않을 것입니다. 어쨌든 한 줄짜리 논쟁에 찬성하는 사람은 아무도 없습니다.

정규 표현식이 너무 복잡해서 주석이 있어도 이해할 수 없다면 아마 정규 표현식은 그 특정 문제에 대한 좋은 해결책이 아니 겠지만, 그렇다고해서 아무 쓸모가 없다는 의미는 아닙니다. 당신이 의도적으로 피할 수 있다면 코드베이스에 여러 줄의 코드가 있고 하나의 단순한 Regex가 같은 일을했을 장소가있을 것입니다.

Regexbuddy는 작성하는 정규 표현식이 기대 한대로 작동하도록하는 유용한 바로 가기이지만 확실히 삶을 편하게 만듭니다. 그러나 모든 것을 사용하면 문제에 대해 중요한 것으로 보입니다 .

+0

내가 Remo에 주석을 달았을 때 나는 일반 표현의 사용에 완전히 동의하고이를 사용했다.(응답에 기반하여) 나는 이미 주어진 도구이므로 어떤 도구가 사용되고 있는지에 대해 걱정하는 것은 지나치게 편집증 적이라는 것을 알기 시작했습니다. :-) –

1

다른 사람들이 말했듯이, 그런 도구를 사용하거나 사용하지 않는 것이 중립적 인 문제라고 생각합니다. 더 중요한 점 : 정규 표현식이 너무 복잡하여 인라인 주석이 필요한 경우 너무 복잡합니다. 나는 내 정규 표현식을 언급하지 않는다. 나는 크거나 복잡한 매칭 문제를 여러 매치 문장 (= ~)을 사용하거나 sub regexps가있는 정규 표현식을 만들어 여러 단계로 나누어 접근합니다.

모든 것을 말하면서, 나는 그의 소금에 합당한 개발자는 정규 표현식 글쓰기 및 읽기에 능숙해야한다고 생각합니다. 나는 수년간 정규 표현식을 사용 해왔고 결코 복잡한 것을 작성하거나 읽어야 할 때가 없었습니다. 그러나 적당한 크기의 하나는 유효성 검사 또는 일치를 수행하는 가장 우아하고 간결한 방법 일 수 있으며, 경험이 부족한 개발자가이를 읽을 수 없으므로 정규 표현식을 멀리하지 말아야합니다. 개발자를 교육하는 것이 더 좋습니다.

0

정규식 도구를 사용하지 않는 것이 좋습니다. 손으로 쓸 수 없다면 도구의 출력이 이해할 수없고 유지할 수없는 것임을 의미합니다. 오히려 정규식 도구를 배우는 것보다 정규식 기능을 사용하는 데 많은 시간을 할애하고 싶습니다. 나는 정규 표현식이 회피되거나 고립 될 검은 예술이라는 많은 프로그래머들의 태도를 이해하지 못한다. 그것은 배울 수있는 또 하나의 프로그래밍 언어 일뿐입니다.

정규식 도구를 사용하면 내가 알고있는 정규식 기능을 구현하는 데 시간을 절약 할 수 있지만 필자는이를 의심스럽게 생각합니다 ... 구문을 잘 이해하면 텍스트 편집기를 사용하여 정규 표현식은 관용적이다. gVim을 사용한다.) 대부분의 정규 표현식은 실제로 그렇게 복잡하지 않다.도구가 단순한 정보를 넣고 많은 보편적 인 코드를 얻을 수있는 것이 아닌 한, 버팀목을 배우기보다는 기술을 더 잘 배우는 것이 도움이 될 것입니다.

1

당신은 일을해야합니까해야 할 일은 다른 개발자가 RB에 접속하는 것입니다.

전체 "2 probs"견적에 대해 걱정하지 마십시오. 그것은 Perl에 대한 폭발일지도 모릅니다. (1997 년에 말했듯이) 정규 표현식이 아닙니다.

+0

Perl은 정규 표현식 작업을 상대적으로 어렵게 만드는 몇 안되는 언어 중 하나입니다. – Dan

+0

동의합니다. REGEX를 일류 시민으로 지원하는 다른 언어가 좋기 때문에 객체를 만들 필요가 없으며 단순한 정규식을 만들기 위해 10 가지 다른 것들을 초기화 할 필요가 없습니다. – Kibbee

10

정규식은 사용 가능한 여러 도구 중 하나 일뿐입니다. 나는 일반적으로 인용 된 Zawinski 인용문에 동의하지 않습니다. 어떤 기술이나 기법이든 적용 할 좋은 방법과 나쁜 방법이 있습니다.

개인적으로 저는 RegexBuddy와 무료로 Regex Coach 같은 것을 학습 도구로 봅니다. 확실하게 그들이 기존의 정규식을 디버깅하거나 이해하는 데 도움이 될 때가 있지만 일반적으로 툴을 사용하여 정규식을 작성했다면 유지 보수하기가 매우 어려울 것입니다.

Perl 프로그래머로서 나는 좋은 정규 표현식과 나쁜 정규 표현식에 대해 매우 잘 알고 있으며 수년 동안 생산 코드에서 복잡한 정규 표현식도 성공적으로 사용 해왔다. 저는 여기에 충실하고자 가이드 라인의 일부가 여러 곳에서 수집 된 해당됩니다 문자열 일치 할 때

  • 는 정규식을 사용하지 마십시오. 대개 대문자와 무관하게 문자열을 일치시키기 위해 사람들이 정규 표현식을 사용하는 코드를 종종 봅니다. 단순히 문자열을 대문자로하거나 대문자로 비교하고 표준 문자열 비교를 수행하십시오.
  • 문자열이 여러 가지 가능한 값 중 하나인지 확인하기 위해 정규식을 사용하지 마십시오. 이것은 유지하기가 불필요하게 어렵습니다. 대신 해시 (사용자의 언어가 무엇이든간에) 배열에 가능한 값을 배치하고 그 값에 대해 문자열을 테스트하십시오.
  • 테스트를 작성하십시오! 정규 표현식을 특별히 대상으로하는 일련의 테스트를 수행하면 개발이 훨씬 쉬워집니다. 특히 막연하게 복잡한 경우 더욱 그러합니다. 또한, 몇 가지 테스트는 종종 유지 보수 프로그래머가 정규 표현식에 대해 가질 수있는 많은 질문에 대답 할 수 있습니다.
  • 작은 부분으로 정규 표현식을 구성하십시오. 큰 복잡한 정규 표현식이 정말로 필요한 경우 더 작고 테스트 가능한 섹션으로 구성하십시오. 이렇게하면 개발이 더 쉬워 질뿐만 아니라 (각 작은 섹션을 개별적으로 올바르게 만들 수 있기 때문에) 코드가 더 읽기 쉽고 유연하며 철저한 주석을 달 수 있습니다.
  • 정규식을 전용 서브 루틴/함수/메소드로 작성하십시오. 이렇게하면 정규식에 대한 테스트를 작성하는 것이 매우 쉽습니다. ( 정규식). 그것은 또한 당신의 정규 표현식이 읽기 쉬운 코드를 만듭니다. (멋지게 명명 된 함수 호출은 무작위 구두점 블록보다 훨씬 덜 무섭습니다!). 대용량 정규 표현식을 코드 블록 중간에 떨어 뜨리면 (매우 쉽게 분리하여 테스트 할 수없는 경우) 매우 일반적이며 일반적으로 매우 쉽게 피할 수 있습니다.
0

글쎄, 그건 똑똑한 사람이 일치하는대로 주석을 달아주는 정규식 도구를 소개하는 것 같아 보입니다. 그 도구를 사용하여 도구가 이해하는 것과 프로그래머가 이해할 수있는 사이에 큰 차이가 있는지 여부만큼이나 문제가되지 않습니다 제안합니다.

문서가 도움이 될 수 있습니다.

이 진짜 사소한 예입니다하지만, 나는이 문제를 다음을 참조하십시오 (단지 제안)과 같은 테이블

Expression  Match  Reason 
^     Pos 0  Start of input 
\s+    "  " At least one space 
(abs|floor|ceil) ceil  One of "abs", "floor", or "ceil" 
... 

입니다. 구문 분석 할 수있는 것보다 복잡한 정규 표현식을 작성하지 못하게하는 것이 좋습니다. 나는 표준이 확장 RE를 항상 요구하고 주석이 적절한지 확인함으로써이를 해결할 수 있다고 생각한다.

그러나 RE를 디버깅하려는 경우 RE가 작동하고 있다고 생각할 때 작동하는지 확인하기 위해 디버깅해야 할 코드를 작성하는 것과 별반 다르지 않습니다.

상대적입니다.

0

내가 (다른 프로젝트) 제작 (노드/JS, PHP파이썬에 대한) 정규식 도구의 몇 재생하고 실험하는 온라인 사용할 수 있습니다.

regex-analyzerregex-composer

github repo

관련 문제