2014-12-12 4 views
1

xfooxbar과 같은 문자열이 있는데, scan을 사용하여 [ 'foo', 'bar']로 나누고 싶습니다. (누군가가 split을 사용하지 않는 이유를 묻기 전에, 실제 예제는 더 복잡합니다. 경계 문자열을 가져야하는데, 이는 파기를 나눕니다.이 질문을 통해 스캔 작동 방식에 대해 더 많이 이해할 수 있습니다. . 내가 예상했던 것보다 어렵게) 발견 유사한 대안,Ruby - 스캔으로 여러 문자열 분할하기

는 문자열이 끝날 때까지 스캔을 유지하기 때문에이 작동하지 않습니다

"xfooxbar".scan(/(?:x)(.*)/) 
> [["fooxbar"]] 

문제는 그 검사는 마술 멈추지 않는다 다음 패턴을 찾을 때 스캐닝하고 (. *?)로 욕심이 없도록 만들면 끝 점이 없으므로 비어있게됩니다. 그래서 우리는 다음 경기로 엔드 포인트를 추가 할 수 있습니다

"xfooxbar".scan(/(?:x)(.*)(?:x)/) 
> [["foo"]] 

문제는 현재 위치에 대한 포인터를 유지하고 철수하지 않으므로 그 검사가 분명히 문자열에 가능한 모든 패턴과 일치하지 않을 수 있습니다. 따라서 두 번째 경계에서 일치하고 거기에서 스캔을 다시 시작합니다 (? :는 이에 영향을주지 않습니다).

답변

2

아래와 같이 긍정적 인 표정 어설 션을 사용하십시오.

irb(main):001:0> "xfooxbar".scan(/(?<=x)[^x]*/) 
=> ["foo", "bar"] 
  • (?<=x) 긍정적 인 lookbehind는 경기 편지 x가 선행되어야 함을 주장한다.
  • [^x]*x이 아닌 임의의 문자와 일치, 0 번 이상.
+0

감사합니다, 그것은 잘 작동 (I는 점을 증명하기 위해 원래의 문자열을 확장했다). 하지만 그것을 DRY로 만들고 반복되는 패턴과 일치시키는 방법이 없을까요? (실제 예제는 여러 줄로되어있어 <=와 ^를 사용해야하는 것은 번거롭고 까다로운 작업이었습니다. 원하는 스캔이 간단한 파서의 역할을 할 수 있었고 간단한 패턴으로 반복 패턴을 말할 수있었습니다.) – mahemoff

+0

감사합니다. 이것에 대해 더 많은 정보를 찾을 수 없다면이 질문을 받아 들일 것입니다. – mahemoff

+0

물론 이죠, 환영합니다 .. –

1

내가 뭔가를 놓치지 않는 한이 간단한 x 정규식으로 수행 할 수 없습니까?

pry(main)> "nonexfooxbarxgreedy\ngreedyxgoose".scan(/x([^x]*)/) 
=> [["foo"], ["bar"], ["greedy\ngreedy"], ["goose"]] 
+0

예, 작동합니다. 나는 더 복잡한 패턴을 생각하고있었습니다. 정말로 나는 이것을 건조하게 유지하고, x를 지정하지 않고 "x가 아닌"것을 지정하려고합니다. – mahemoff

관련 문제