2011-11-22 5 views
3

내에서 캐릭터의 모든 발생을 교체 할 필요가 내 캐릭터의 :루비 정규식은 정규식 일치 여기

mystring = %Q{object1="this is, a testyay', asdkf'asfkd", object2="yo ho', ho"}

나는 그러므로 나는 밖으로에 (일시적으로) 서브를 원하는 쉼표에 mystring을 분할하기 위하여려고하고있다 쉼표는 이스케이프 된 따옴표 사이에 있습니다.

그래서 이스케이프 된 인용 부호 + 일부 문자 + 하나 이상의 쉼표 + 이스케이프 된 따옴표를 일치시킨 다음 일치하는 문자열의 쉼표를 gsub해야합니다.

내가 함께했다 GSUB의 정규식 /(".*?),(.*?")/이며, 그래서처럼 사용 : newstring = mystring.gsub(/(".*?),(.*?")/ , "\\1|TEMPSUBSTITUTESTRING|\\2")하지만 이것은 단지가 탈출 따옴표 사이에 발견되는 첫 번째 쉼표를 대체합니다.

어떻게 모든 쉼표를 바꿀 수 있습니까?

감사합니다.

+1

'require 'csv'; CSV.parse (mystring)'그리고 귀찮은 정규식이 필요하지 않습니다. – steenslag

+0

http://rubular.com/은 표현을 고칠 수있는 훌륭한 장소입니다. – slothbear

답변

2

나는 이것이 당신이 원하는 결과를 얻는 한 가지 방법이라고 생각합니다.

일치하는 문자열 (따옴표 붙은 부분)을 코드 블록에 전달합니다. 코드 블록은 쉼표의 모든 발생을 바꿉니다. 초기 정규식은 아마도 /".*?"/ 일 수 있지만 쉼표가없는 경우에도 인용 된 각 문자열에 대해 코드 블록이 호출되므로 효율성이 떨어집니다. 모든 신경 쓰지 마십시오

1

, 그냥이 정규식에 mystring 분할 :

,(?=(?:[^"]*"[^"]*")*[^"]*$) 

룩어 그것이 내부 을 아니에요 의미하는 쉼표 따옴표의 짝수 뒤에 주장 quoted value.