2017-05-17 1 views
-1

두 구분 기호 사이에서 문자열을 찾을 수있는 정규 표현식을 만들려고합니다. 데이터가 ^||^로 구분하고 선이 ^|x|x|^ 종료하고 있지만, 그것은 CSV처럼정규식은 특정 구분 기호 앞에 모든 것을 검색합니다.

1234 ^||^ 5678 ^||^ 127.0.0.1 ^|x|x|^ 

: I는 다음과 같다 로그 데이터를 가지고있다. 나는 이것에 대해 아무런 통제력이 없다. 이것은 데이터가 제 3 자에 의해 우리에게 보내지는 방식이다.

저는 분리 기호 사이의 모든 데이터를 캡처하려고합니다. 나는 분리 또는 라인 끝 중 하나에 대한 긍정적 예측을 사용하여이 정규식 함께했다 :이 가까이 온다, 그러나 문제는 즉시 ^ 텍스트에 나타나는, 일치 없다는 것입니다

[^\^]+(?=(\s\^\|\|\^\s|\s\^\|x\|x\|\^)) 

. [^\^]+.+으로 바꾼다면 정규식은 너무 욕심이 생겨 구분 기호 자체를 포함하여 마지막 필드까지 모든 것을 일치시킵니다.

^을 포함하여 ^||^ 구분 기호 사이의 모든 항목을 변경하려면 무엇을 변경해야합니까? 언어는 정규식 긍정적 인 lookbehind 지원하는 경우

+0

먼저'^ | x | x | ^'을 (를) 제거하고'^ || ^'로 분리하지 않으시겠습니까? 적어도 당신이 사용하는 정규 표현식 라이브러리 (언어 또는 도구)를 알리십시오. –

+1

사용중인 도구/언어를 알려주십시오. 대부분의 언어에는 문제를 쉽게 해결할 수있는 문자열 분할 기능이 있습니다. –

+0

@TimBiegeleisen 저는 이것을 [grok 패턴] (https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html)의 일부로 캡처하려고합니다. Logstash로 데이터를 저장하십시오. – Oldskool

답변

2

(?<=^|\^\|\|\^\s).+?(?=\s\^\|x?\|x?\|?\^)

Demo

설명 : (예 : PCRE)를, 당신은 하나를 @degant 사용할 수 있습니다, 다른 사람이 하나를 사용할 수 있습니다

(?<=^|\^\|\|\^\s) 시작 앵커 또는^||^

로 시작됨

.+ 하나 이상의 문자

(?=\s\^\|x?\|x?\|?\^) 뒤에 ^, 선택적 x, | 선택적 X, 선택 |,^

Demo

+0

여전히'^'가 텍스트의 일부인 경우 필드가 무시된다는 문제가 있습니다. 예를 들어, https://regex101.com/r/LDsMJM/3 5678의 중간에 ^를 추가하면 무시됩니다. – Oldskool

+0

좋은 지적. 고정하지만 긍정적 인 lookbehind를 지원하지 않는 언어로 지원되지 않음 –

+0

OP는'[^ \ ^] +'을 사용 했으므로 값에는'^ '이 포함되지 않는다고 가정합니다. –

1

하는 방법 (^ 또는 | 포함 된 텍스트 포함) 아무것도 캡처 아래 정규식에 대한 :

(.+?)(?:\s\^\|x?\|x?\|?\^\s?) 

및 캡처 그룹 1을 사용하여 당신이 찾고있는 텍스트를 얻는 것. @ stej4n에 의해 지적 개선 : 테스트 문자열 1^2|34 ^||^ 56|7|8 ^||^ 6^9 ^|x|x|^

1^2|34, 56|7|86^9

편집을 추출에 대한

Regex101 Demo

.

+0

이렇게 단순화 할 수 있습니다 :'(. +?) (? : \ s \^\ | x? \ | x? \ |? \^\ s?)'https://regex101.com/r/laEV7K/2 –

+0

맞습니다. 좋은 지적 :). 감사! – degant

관련 문제