정규식에서 슬래시 이스케이프


106

내 질문은 간단한 질문이며 정규 표현식 이스케이프에 관한 것입니다. /정규식에서 슬래시를 이스케이프해야 합니까? 그리고 어떻게 하시겠습니까?


1
어떤 언어 / 정규식 구현을 사용하십니까?
Gumbo

흥미롭게도 Javascript에 대한이 질문을 찾고있었습니다. 그러나 내 IDE는 불필요한 탈출구를 사용하고 있다고 말했습니다. 그래서 myStr.replace(/[/:.-]+/gi, '_')놀랍게도 유효합니다. 나는 내가 필요하다고 생각했다 /[\/:.-]+/gi. 이것이 멋지거나 혼란 스러운지 결정할 수 없습니다.
Turbo

답변:


90

어떤 맥락 / 언어? 일부 언어 /는 패턴 구분 기호 로 사용 되므로 예, 어떤 언어 / 컨텍스트에 따라 이스케이프해야합니다. 그 앞에 백 슬래시를 넣어 이스케이프합니다. \/PHP와 같은 일부 언어의 경우 다른 문자를 구분 기호로 사용할 수 있으므로 이스케이프 할 필요가 없습니다. 그러나 AFAIK는 모든 언어에서 유일하게 특별한 의미 /는 지정된 패턴 구분 기호 일 수 있다는 것입니다.


38

다음은 몇 가지 옵션입니다.

  • Perl에서는 대체 구분 기호를 선택할 수 있습니다. 당신은에 국한되지 않습니다 m//. 같은 다른 것을 선택할 수 있습니다 m{}. 그런 다음 탈출이 필요하지 않습니다. 사실 "Perl Best Practices"의 Damian Conway는 이것이 사용해야 m{}하는 유일한 대체 구분 기호라고 주장하며 이는 Perl :: Critic (CPAN에서)에 의해 강화됩니다. 당신은 대체 구분 문자의 다양한 사용하여 멀리 얻을 수 있지만 //{}나중에 해독 깨끗한 것 같다. 그러나 이러한 선택 중 하나가 너무 많이 이스케이프되는 경우 가독성에 가장 적합한 것을 선택하십시오. 일반적인 예는 m(...), m[...]m!...!입니다.

  • 당신은 하나 또는 다른 구분 기호를 사용하지 않으 수없는 경우에, 당신은 백 슬래시 슬래시를 탈출 할 수 있습니다 m/\/[^/]+$/(예를 들어이 될 수있는 대체 구분하여 m{/[^/]+$}더 명확하게 읽을 수있다). 백 슬래시로 슬래시를 피하는 것은 이름과 위키피디아 페이지 인 Leaning Toothpick Syndrome 을 얻을 수있을만큼 일반적 입니다. 단 하나의 인스턴스 만있는 정규식에서 슬래시를 이스케이프하는 것은 가독성을 저해하는 수준으로 올라가지 않을 수 있지만 손을 떼기 시작하고 언어가 Perl처럼 대체 구분 기호를 허용하는 경우 선호하는 솔루션입니다.


1
예를 들어 줄 수 있습니까? 나는 이것을 가지고 있습니다 : perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.conf그리고 나는 슬래시와 충돌합니다.
CMCDragonkai 2013

참고이를 사용하는 것이 s아닌 m, A는 정규 표현식 (대체 일명) 교체 할 때. perlfect.com/articles/regex.shtml
Mashmagar 2014

2
@CMCDragonkai perl -pi -e "s{chdir .*}{chdir $ROBOT_PATH}g" startup_scripts/supervisord.conf...하지만 이것은 아마도 더 낫습니다 : perl -pi -e 's/chdir .*/chdir $ENV{ROBOT_PATH}/g' startup_scripts/supervisord.conf쉘 보간을 피하기 때문입니다.
DavidO 2015 년

1
리터럴 /문자 를 이스케이프하는 대안 은 ASCII 인코딩으로 문자를 16 진수 또는 8 진수로 지정하는 정규식 기능을 사용하는 것입니다. 펄은 8 진수 형태로 받아들 \57(소스 regular-expressions.info/refcharacters.html )
lukeuser

lukeuser (감사합니다)가 링크 한 페이지에는 Escape Sequence \ Q ... \ E도 있습니다. 이것은 나를 위해 일했습니다.
user3012857

11

백 슬래시를 사용 \하거나 다른 구분 기호를 선택, 즉 m#.\d#대신 /.\d/ "당신이 (일치) 문자 m와 함께보다 선행하는 경우에 펄, 당신은 다른 어떤 특수 문자에 / 정규 표현식 구분 기호를 변경할 수 있습니다"


6

구분 기호가 /이면 이스케이프해야합니다.


0

C #을 사용하는 경우에는 이스케이프 할 필요가 없습니다.


그럴 수도 있지만 여기에서는 펄을 사용하고 있습니다.
토토

0

자바의 경우 그럴 필요가 없습니다.

eg: "^(.*)/\\*LOG:(\\d+)\\*/(.*)$" ==> ^(.*)/\*LOG:(\d+)\*/(.*)$

/ 앞에 \를 넣으면. IDE는 "ReGex에서 중복 문자 이스케이프"\ / "를 알려줍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.