2016-09-10 2 views
0

나는 큰 따옴표의 모든 출현을 작은 따옴표로 바꾸려고합니다. 내가 좋아하는 그룹 t(".headline") 일치 (?<=<%=\s)(.*)(\")(.*)(?=\s%>) 시도했습니다SublimeText regexp 루비 태그 안에 따옴표를 대체하십시오

  • <%= t(".headline") %>
  • <%= f.text_field :email, class: "center big" %>

: 예는 모든 차례 나오는 캡처하지 않습니다 분명히

1. [4-16] `t(".headline` 
2. [16-17] `"` 
3. [17-18] `)` 

를, 그룹의 모든 그밖에.

또한 Sublime의 Replace: [input box]에서 대체 할 내용이 아닙니다. $1'$2 등과 같은 것이 있지만 얼마나 많은 캡처가 있는지 알 수 없습니까? (<%= t('$1') %>

아직

완벽하지로 교체보다 당신이해야합니다가 있다면 "의 한 쌍, 거기에 가정

<%= t\("([^"]*)"\) %> :

답변

0

작동하지 않는 정규식 분명 이유 그것은 하나의을 캡처합니다.을 건너 뛰고 나머지는 건너 뛰지만 "이있는 각 위치에서 멈춰야합니다. \G token으로 할 수 있습니다.

정규식 :

<%(?:(?!%>)[^"])*\K"|(?!\A)\G(?:(?!%>)[^"\\])*(?:\\.(?:(?!%>)[^"\\])*)*\K" 

교체 문자열 : '

Live demo

숭고한 텍스트 정규 표현식 이후

정규식 아래 펄 호환 (PCRE)이이 문제에 대한 올바른 솔루션입니다

설명 :

<%      # Match beginning of Ruby tag 
(?:(?!%>)[^"])*   # Match any thing except a double quote - caring not to jump over closing tag (zero or more times) 
\K"      # Up to a double quote (\K reset all match so far) 
|      # OR 
(?!\A)\G    # Assert end of previous match 
(?:(?!%>)[^"\\])*  # Match any thing except a double quote and backslash - caring not to jump over closing tag (zero or more times) 
(?:      # Start of non-capturing group (c) 
    \\.      # Match an escaped character 
    (?:(?!%>)[^"\\])*  # Match any thing except a double quote and backslash - caring not to jump over closing tag (zero or more times) 
)*      # End of non-capturing group (c) (zero or more times) 
\K"      # Up to a double quote (\K reset all match so far) 

숭고한 텍스트 미리보기 :

enter image description here

+0

나는'\ K'을 절대 사용하지 않았습니다. 새로운 것을 배우기 :) – Frexuz

0

내가 숭고한 사용하지만,이 같은 vscode 뭔가하지 않는 작품 실행) 다시 교체 :

<%=([^"]*)"([^"]*)"([^"]*)%> =><%=$1'$2'$3%>

+0

업데이트 예. 나는 특히't()'메소드가 아닌 루비 태그에서 큰 따옴표가 나오는 것을 모두 말했습니다. – Frexuz

관련 문제