2010-06-13 4 views
41

내가 즉, 명시 적으로 번호를 반복하는 대신 ?, *+를 사용하는 정규식 패턴을 본 적이 :명시 적으로 대신 물음표, 스타의 반복 번호를 사용하고 플러스

Explicit   Shorthand 
(something){0,1} (something)? 
(something){1}  (something) 
(something){0,}  (something)* 
(something){1,}  (something)+ 

질문은 다음과 같습니다

  • 두 형식이 동일합니까? 만약 당신이 소유/주저하는 수정자를 추가한다면?
  • 동일하면 어느 것이 더 관용적입니까? 좀 더 가독성? 단순히 "더 나은"?

답변

55

제 지식은 동일합니다. 거기에 번호가 매겨진 구문을 지원하지 않는 엔진이 몇 개 있다고 생각하지만 확실하지 않습니다. 며칠 전 분명하게 Notepad ++에서 명시적인 표기법이 작동하지 않는 질문을 회상합니다. 정확히

  • 이 : {2}
  • 두 개 이상의 : {2,}
  • 2 ~ 4 : {2,4}
  • 반복이 1보다 큰 경우 내가 명시 적으로 번호가 반복을 사용

    유일한 시간이다

특히 반복되는 패턴이 몇자를 넘을 때 이러한 패턴을 선호하는 경향이 있습니다. 3 개의 숫자를 매치해야한다면, 어떤 사람들은 \d\d\d이라고 쓰고 싶지만, 반복 횟수를 강조하기 때문에 \d{3}이라고 쓰고 싶습니다. 또한 도로 번호를 변경해야 할 경우, {3}{n}으로 변경하고 내 머리 속에있는 정규식을 다시 구문 분석하지 말아야합니다. 정신적 노력이 덜 필요합니다.

해당 기준이 충족되지 않으면 나는 속기를 선호합니다. "명시 적"표기법을 사용하면 패턴이 빠르게 복잡 해져서 읽기가 어려워집니다. 저는 일부 개발자가 정규 표현식을 너무 잘 모르는 프로젝트 (정확히 모든 사람들이 좋아하는 주제는 아닙니다)에서 작업했으며 많은 것을 보았습니다 및 {0,1} 번 발생했습니다. 몇 사람들은 저에게 패턴을 검토하도록 코드를 요청할 것입니다. 그리고 그 사건을 속기 표기법으로 바꾸고 공간을 절약하고 IMO가 가독성을 향상시킬 것을 제안 할 것입니다.

+0

+1, 나는 또한 속기가 더 좋다고 생각하지만, 또한 중첩 된 삼자에 대한 사랑에 빠졌고, 나는 그것을하기 위해 사실에 대해 큰 소리를했습니다. 어떤 사람들은'{0,1}'이 "?"보다 의도를 더 분명하게 보여줄 것이라고 생각할 수 있습니다. 따라서 Q. – polygenelubricants

2
  • 예외적 인 정규식 엔진을 사용하지 않는 한 모두 동일합니다. 그러나 모든 정규식 엔진이 번호가 지정된 반복을 지원하지는 않습니다 (? 또는 +).

  • 모두 사용할 수 있다면 숫자가 아닌 문자를 사용하는 것이 더 간단합니다.

1

그들은 동등한 것 (당신은 그들이 당신의 컨텍스트를 테스트하여 사용할 수있어 있는지 확인할 수 있습니다.)

만약 당신이 필요로하는 유일한 사람이 될 수 없습니다 때 내가 예상했던 문제가 코드 작업. 정규 표현식은 대부분의 사람들에게 충분하지 않습니다. 누군가가 특별한 구문을 사용할 때마다 이라는 질문이 생깁니다. "왜 그들은 표준 방식으로하지 않았는가? 내가 실종되었다고 생각하는 이유는 무엇입니까?"

7

내가 예를 들어 당신이 제한된 많은 반복을하는 정규식이있는 경우, 당신은 가독성을 위하여 지속적으로 {n,m} 양식을 사용할 수있는 방법을 볼 수 있습니다.

/^ 
abc{2,5} 
xyz{0,1} 
foo{3,12} 
bar{1,} 
$/x 

하지만 내가 할 수있는 ' 실생활에서 그런 사례를 본 기억이 있습니다 ., {0,} 또는 {1,}이 질문에 사용 된 사실은 사실 거의 항상 무지에서 끝났습니다. 그리고 그러한 질문에 답하는 과정에서 우리는 대신 ?, * 또는 +을 사용하십시오.

그리고 물론 {1}은 순수한 클러 터입니다. 어떤 사람들은 "유일하고 하나"라는 모호한 개념을 가지고있는 것 같습니다. 결국은 무언가가일까요? 왜 그런 병리학 적으로 간결한 언어가 전체 3자를 차지하고 전혀 아무것도하지 않는 구조를지지합니까? 내가 알고있는 유일한 합법적 인 사용법은 역 참조와 리터럴 숫자 (예 : \1{1}0)를 분리하는 것이지만 다른 방법이 있습니다.

관련 문제