나는 guid와 이름, 유형 및 버전과 같은 몇 가지 다른 속성을 추출하는이 정규식이 있습니다. 최적화 및 개선 사항에 대해서는 정규식을 검토하십시오.

문자열은 항상

/publication/guid/type/name;version=1234 

정규식

(([a-f0-9]+\-)+[a-f0-9]+)\/(.*?)\/(.*?);version=(\d*) 

테스트 레코드

문자열에서 굵은 부분을 추출합니다.

/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/collection/content1;version=1520623346833

예상 출력 :

  1. d40a4e4c-d6a3-45ae-98b3-924b31d8712a
  2. 컬렉션
  3. content1
  4. 1520623346833

/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/article/testContent;version=1520623346891

예상 출력

  1. d40a4e4c-d6a3-45ae-98b3 -924b31d8712a
  2. article
  3. testContent
  4. 1520623346891

코드

언어는 F #이지만 정규식은 C #에서도 작동합니다. 또한 Node.js에서 동일한 정규식을 사용하고 싶으므로 정규식이 언어에 구애받지 않기를 바랍니다.

let matchEntity (m: Match) = { id= m.Groups.[1].Value; eType = m.Groups.[3].Value; name= m.Groups.[4].Value; version = m.Groups.[5].Value} let regex = new Regex("(([a-f0-9]+\-)+[a-f0-9]+)\/(.*?)\/(.*?);version=(\d*)") matchEntity regex.Match "/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/collection/content1;version=1520623346833" 

여기에 이미지 설명 입력

댓글

  • 코드 추가, 언어는 C #, f #이지만 언어 불가지론이어야합니다. nodejs에서도 사용합니다. 정규식은 일반이어야하며 특정 언어 구현이 필요하지 않습니다.
  • 그렇지 않습니다. ' 정규식에서 작동하지 않습니다.
  • 작동합니다. i.stack.imgur.com/gyZnT.png

답변

TL; DR; 조정 목록 :

  • .NET RegEx는 명명 된 캡처 그룹을 지원합니다. 그것들을 활용하십시오.
  • GUID 형식 사양을 활용하십시오.
  • 비 캡처 그룹으로 검색을 단순화하십시오.
  • 문자 클래스에서 가정을 명시 적으로 만드십시오. 탐욕스럽지 않은 일치보다 부정 된 문자 그룹을 선호합니다

대신 다음 정규식 을 제안합니다.

(?<guid>[a-f0-9]{8}(?:\-[a-f0-9]{4}){3}\-[a-f0-9]{12})\/(?<type>[^\/]+)\/(?<name>[^;]+);version=(?<version>\d*) 

이 정규식은 다소 길지만 62 단계에서 두 예제와 일치합니다 (117이 아님). 이것은 사소한 개선처럼 보일 수 있지만 모든 것이 일어나는 것은 아닙니다.

이 정규식은 훨씬 더 자연스럽고 명확한 패턴 추출을 허용하는 명명 된 캡처 링 그룹을 사용합니다. 매직 인덱스로 그룹에 액세스하는 대신, 이름으로 액세스 할 수 있으며 matchEntity의 구성은 다음과 같이 수행됩니다.

let matchEntity (m: Match) = { id= m.Groups.["guid"].Value; eType = m.Groups.["type"].Value; name= m.Groups.["name"].Value; version = m.Groups.["version"].Value } 

마지막으로 중요합니다. 이 정규식은 또한 잘못된 GUID 사양과 일치하지

댓글

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다