2017-09-21 1 views
2

이것은 내 문자열입니다.정규식으로 문자열 나누기

19282511~2017-08-28 13:24:28~Entering (A/B)~1013~283264/89282511~2017-08-28 13:24:28~Entering (A/B)~1013~283266/79282511~2017-08-28 13:24:28~Entering (A/B)~1013~283261 

나는이 문자열은 다음과 같이 나눌 수 싶습니다 또한 분할을 얻을 것이다 값 A/B 있기 때문에

19282511~2017-08-28 13:24:28~Entering (A/B)~1013~283264 
89282511~2017-08-28 13:24:28~Entering (A/B)~1013~283266 
79282511~2017-08-28 13:24:28~Entering (A/B)~1013~283261 

나는 슬래시 (/)에 의해 맹목적으로 내 문자열을 분할 할 수 있습니다.

정규 표현식으로이 작업을 수행하려는 아이디어가 있습니까?

귀하의 도움을 분명히 이해할 수있을 것입니다.

답변

4

당신은 숫자 사이에 /로 분할 할 수 있습니다

(?<=\d)/(?=\d) 

regex demo

세부

  • (?<=\d)보기 - 즉시 표시 할 숫자를 필요로하는 긍정적 인 lookbehind을 현재 위치의 왼쪽에
  • / - a / char
  • (?=\d) - 현재 위치의 오른쪽에 자릿수가 즉시 나타나야합니다. \d 패턴입니다

비 소모적 인 패턴 만 /이 분할시 삭제되며 숫자가 결과 항목에 남아 안에.

enter image description here

또 다른 아이디어는 일치 캡처 이러한 문자열은 this regex demo를 참조

/?([^~]*(?:~[^~]*){3}~\d+) 

을 사용하는 것입니다.

세부

  • /?-1 0 / 문자
  • ([^~]*(?:~[^~]*){3}~\d+) - 그룹 1 (당신이 잡아 필요) :

    • [^~]* - 제로 또는 이외의 많은 문자 ~
    • (?:~[^~]*){3} - ~의 시퀀스가 ​​3 개 이상 있고 ~
    • ~\d+ - ~ 이외의 0 개 이상의 문자가 포함 된 다음 1 자리 이상이어야합니다. C# 코드는 다음과 같이 표시됩니다.

    var results = Regex.Matches (s, @ "/?(? [^ ~] (~ [^ ~]) {3} ~ \ D +) ") .Cast() ALL 기타 사항 서보 -OFF (m => m.Groups 1 .Value) .ToList();

enter image description here

참고 : 기본적으로 \d 일치하는 모든 유니 코드 숫자이 동작을하지 않으려면 RegexOptions.ECMAScript 옵션을 사용하거나에만 일치 ASCII 숫자에 [0-9]\d 교체

..
+1

이것은 Regex의 아름다움입니다. 신속하고 멋진 답변에 많은 감사드립니다. 나는 이것을 7 분 안에 대답으로 받아 들일 것이다. –