문제

Ruby를 사용하여 단일 정규식을 사용하여 "xy y ay xy +y"에서 x(y, ay, +y)가 앞에 나오지 않는 모든 'y' 항목을 일치시키려면 어떻게 해야 합니까?
/[^x]y/도 앞의 문자와 일치하므로 대안이 필요합니다...

도움이 되었습니까?

해결책

당신은 제로 너비의 음수 외관 어설 션이 필요합니다. 노력하다 /(?<!x)y/ 여기서는 당신이 찾고있는 것을 정확하게 말하고 있습니다. 즉, 'y'는 'x'가 미리 미리 미리 비우지 않지만 이전 문자는 포함되지 않습니다.

추가로 편집 : 분명히 이것은 Ruby 1.9 이상에서만 지원됩니다.

다른 팁

부정적인 외관은 루비 1.9까지 지원되지 않지만 스캔을 사용하여 비슷한 일을 할 수 있습니다.

"xy y ay xy +y".scan(/([^x])(y)/) # => [[" ", "y"], ["a", "y"], ["+", "y"]]
"xy y ay xy +y".scan(/([^x])(y)/).map {|match| match[1]}  # => ["y", "y", "y"]

물론, 이것은 당신이 전에 단일 캐릭터보다 훨씬 더 많은 것을 피하고 싶다면 훨씬 더 어렵습니다. y. 그런 다음 다음과 같은 작업을 수행해야합니다.

"abby y crabby bally +y".scan(/(.*?)(y)/).reject {|str| str[0] =~ /ab/}  # => [[" ", "y"], [" ball", "y"], [" +", "y"]]
"abby y crabby bally +y".scan(/(.*?)(y)/).reject {|str| str[0] =~ /ab/}.map {|match| match[1]}  # => ["y", "y" "y"]

불행히도 Ruby는 부정적인 뒤돌아보기를 지원하지 않으므로 단일 문자 이상을 찾아야 하는 경우 문제가 발생할 수 있습니다.단 한 명의 캐릭터에 대해서는 일치 항목을 캡처하여 이 문제를 해결할 수 있습니다.

/[^x](y)/

PCRE에서는 부정적인 외관을 사용합니다.

(:<!x)y

이것이 루비가 지원하는지 확실하지 않지만 언제든지 찾을 수 있습니다.

부정적인 모습으로 수행 할 수 있습니다. (?<!x)y

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top