정규 표현식이 문자 대신 키워드를 사용할 수없는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/629573

  •  08-07-2019
  •  | 
  •  

문제

좋아, 나는 Regex 기본 사항을 간신히 이해하지 못하지만 왜 비밀스러운 와일드 카드 문자와 기호 대신 키워드 (SQL과 같은)를 사용하도록 디자인 할 수 없었습니까?

Regex가 런타임에 해석/구문 분석 이후 성능을위한 것입니까? (컴파일되지 않음)

아니면 글쓰기 속도를 위해? "간단한"문자 조합을 배울 때 키워드 대신 1 문자를 입력하기가 더 쉬워집니다.

도움이 되었습니까?

해결책

당신은 정말로 원합니다 이것?

Pattern findGamesPattern = Pattern.With.Literal(@"<div")
    .WhiteSpace.Repeat.ZeroOrMore
    .Literal(@"class=""game""").WhiteSpace.Repeat.ZeroOrMore.Literal(@"id=""")
    .NamedGroup("gameId", Pattern.With.Digit.Repeat.OneOrMore)
    .Literal(@"-game""")
    .NamedGroup("content", Pattern.With.Anything.Repeat.Lazy.ZeroOrMore)
    .Literal(@"<!--gameStatus")
    .WhiteSpace.Repeat.ZeroOrMore.Literal("=").WhiteSpace.Repeat.ZeroOrMore
    .NamedGroup("gameState", Pattern.With.Digit.Repeat.OneOrMore)
    .Literal("-->");

좋습니다만 그것은 당신의 장례식입니다, 남성.

이 작업을 수행하는 라이브러리를 다운로드하십시오.
http://flimflan.com/blog/readableregularexpressions.aspx

다른 팁

정규식에는 수학적 (실제로 언어 이론) 배경이 있으며 다소 코딩됩니다. 수학적 공식. 예를 들어 일련의 규칙으로 정의 할 수 있습니다.

  • 모든 캐릭터는 자신을 나타내는 정규 표현입니다
  • 만약에 a 그리고 b 그러므로 정규 표현입니다 a?, a|b 그리고 ab 정규 표현도 있습니다
  • ...

키워드 기반 언어를 사용하는 것은 간단한 정규식에 큰 부담이 될 것입니다. 대부분의 경우 간단한 텍스트 문자열을 검색 패턴으로 사용합니다.

grep -R 'main' *.c

또는 매우 간단한 패턴 :

grep -c ':-[)(]' seidl.txt

정규 표현식에 익숙해지면이 구문은 매우 명확하고 정확합니다. 더 복잡한 상황에서는 큰 정규 표현이 분명히 읽기가 어렵 기 때문에 다른 것을 사용할 것입니다.

Perl 6은 Regex 가독성에서 꽤 혁신적인 발전을 이루고 있습니다. 양식의 주소를 고려하십시오 : 100 E Main St Springfield MA 01234

다음은 적당히 읽을 수있는 Perl 5 호환 가능한 정규식이 있습니다 (많은 코너 케이스가 처리되지 않음).

 m/
     ([1-9]\d*)\s+
     ((?:N|S|E|W)\s+)?
     (\w+(?:\s+\w+)*)\s+
     (ave|ln|st|rd)\s+
     ([:alpha:]+(?:\s+[:alpha:]+)*)\s+
     ([A-Z]{2})\s+
     (\d{5}(?:-\d{4})?)
  /ix;

이 perl 6 Regex는 동일한 동작을 가지고 있습니다.

grammar USMailAddress {
     rule  TOP { <addr> <city> <state> <zip> }

     rule  addr { <[1..9]>\d* <direction>?
                  <streetname> <streettype> }
     token direction { N | S | E | W }
     token streetname { \w+ [ \s+ \w+ ]* }
     token streettype {:i ave | ln | rd | st }
     token city { <alpha> [ \s+ <alpha> ]* }
     token state { <[A..Z]>**{2} }
     token zip { \d**{5} [ - \d**{4} ]? }
  }

Perl 6 문법은 클래스이며 토큰은 모두 호출 가능한 방법입니다. 다음과 같이 사용하십시오.

if $addr ~~ m/^<USMailAddress::TOP>$/ {
     say "$<city>, $<state>";
}

이 예제는 a에서 제공됩니다 내가 발표 한 이야기 ~에서 냉동 Perl 2009 작업장. Perl 6의 Rakudo 구현은이 예제가 오늘날 작동 할 수있을 정도로 완료되었습니다.

자, 키워드가 있다면 실제로 일치하는 텍스트와 쉽게 키워드를 구별 할 수 있습니까? 공백을 어떻게 처리 하시겠습니까?

출처 텍스트 회사 : 부서 : b

표준 동정인 :

Company:\s+(.+)\s+Dept.:\s+(.+)

또는:

Company: (.+) Dept. (.+)

키워드 Regex (정말 열심히 노력하는 것은 밀짚 맨을 얻지 못합니다 ...)

"Company:" whitespace.oneplus group(any.oneplus) whitespace.oneplus "Dept.:" whitespace.oneplus group(any.oneplus)

또는 단순화 :

"Company:" space group(any.oneplus) space "Dept.:" space group(any.oneplus)

아니요, 아마도 나쁘지 않을 것입니다.

공식 언어 이론에 해당하고 수학 표기법이기 때문입니다.

그것은 Perl의 잘못입니다 ...!

실제로,보다 구체적으로, 정기적 인 표현은 초기 유닉스 개발에서 나 왔으며 간결한 구문은 훨씬 더 가치가있었습니다. 저장, 처리 시간, 물리적 터미널 등은 오늘날과 달리 매우 제한적이었습니다.

Wikipedia에 대한 정규 표현의 역사 더 설명합니다.

Regex에 대한 대안이 있지만 실제로 아무것도 잡았는지 확신 할 수 없습니다.

편집 : John Saunders가 수정 : 정규 표현은 대중화되었습니다 UNIX에 의해, 그러나 처음으로 구현되었습니다 Qed 편집자. 동일한 설계 제약 조건이 이전 시스템에 더 적용되었습니다.

사실, 세상은 유닉스로 시작하지 않았습니다. Wikipedia 기사를 읽으면

1950 년대에 수학자 Stephen Cole Kleene은 이러한 모델을 일반 세트라고하는 수학적 표기법을 사용하여 설명했습니다. Snobol 언어는 패턴 일치의 초기 구현 이었지만 정규식과 동일하지는 않았습니다. Ken Thompson은 Kleene의 표기법을 텍스트 파일의 패턴과 일치하는 수단으로 편집자 Qed에 구축했습니다. 그는 나중에이 기능을 UNIX 편집자 ED에 추가했으며 결국 인기있는 검색 도구 Grep의 정규 표현식 사용으로 이어졌습니다.

이것은 Perl보다 훨씬 빠릅니다. 정규 표현에 대한 위키 백과 항목 UNIX 명성의 Ken Thompson에게 정규 표현식의 첫 번째 구현은 QED에서 구현 한 다음 에드 편집자. 나는 명령에 성능의 이유로 짧은 이름을 가지고 있었지만 클라이언트 쪽이되기 전에는 많은 이름을 가지고 있다고 생각합니다. 정규식 마스터 링 정규 표현식에 관한 훌륭한 책으로, 읽고 이해하기 쉽게하기 위해 정규 표현식 ( /x 플래그 포함)에 주석을 달 수있는 옵션을 제공합니다.

유닉스에서 유래 한 많은 것들과 같은 정규 표현에 대한 아이디어는 그들이 간결하고 가독성보다 간결함을 선호한다는 것입니다. 이것은 실제로 좋은 것입니다. 나는 15 줄 길이의 정규 표현 (나의 더 나은 판단에 대한)을 쓰게되었습니다. 그것이 장점 구문이 있다면 그것은 regex가되지 않을 것이며, 그것은 프로그램이 될 것입니다.

실제로 "Wordier"형태의 Regex를 구현하는 것은 매우 쉽습니다. 내 답변을 참조하십시오. 여기. 간단히 말해서 : Regex 문자열을 반환하는 소수의 함수를 작성하고 (필요한 경우 매개 변수를 가져옵니다).

키워드가 어떤 혜택을 줄 것이라고 생각하지 않습니다. 정기적 인 표현은 복잡하지만 매우 강력합니다.

내가 더 혼란스럽게 생각하는 것은 모든 지원 라이브러리가 클래식 Perl Regex (예 : 교체 및 더 많은 예제를 위해)를 사용하거나 확장하는 대신 자체 구문을 발명한다는 것입니다.

나는 당신의 질문에 당신의 질문에 대한 대답을 잘못 알고 있지만 RegexBuddy 평범한 영어로 regexpression을 설명하는 기능이 있습니다. 이것은 조금 더 쉽게 배우게 될 수 있습니다.

사용하는 언어가 지원되는 경우 posix regexes, 당신은 그것들을 사용할 수 있습니다.

An example:

\d

동일합니다

[:digit:]

브래킷 표기법은 그것이 일치하는 것에 대해 훨씬 명확합니다. 나는 여전히 다른 사람들의 코드에서 그것들을보고 이해해야하기 때문에 여전히 "비밀성 와일드 카드 캐릭터와 기호를 배웁니다.

더 많은 예가 있습니다 정기 표현식 테이블 .info의 페이지.

어떤 이유로, 나의 이전 답변이 삭제되었습니다. 어쨌든, 나는 Ruby Regexp Machine이 법안에 맞는 것입니다. http://www.rubyregexp.sf.net. 그것은 내 프로젝트이지만 효과가 있다고 생각합니다.

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