string2가 앞에 오지 않는 한 string1과 일치하는 정규식
-
06-07-2019 - |
문제
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
제휴하지 않습니다 StackOverflow