나는 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
예상 출력 :
- d40a4e4c-d6a3-45ae-98b3-924b31d8712a
- 컬렉션
- content1
- 1520623346833
/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/article/testContent;version=1520623346891
예상 출력
- d40a4e4c-d6a3-45ae-98b3 -924b31d8712a
- article
- testContent
- 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 사양과 일치하지
댓글
- +1, 최근에는 JS에서 명명 된 RegExp 캡처 그룹 도 지원됩니다.