2009-11-01 4 views
0

정규 표현식을 배웠을 때 슬래시 문자로 시작하고 끝내야한다는 것을 배웠습니다 (수정 자 다음에). 예/개 들어정규 표현식 개폐 문자

/I

그러나, 나는 그들을 시작하고 같은 @, #, 및 다른 문자로 끝나는 참조 많은 예에서 |.

예를 들어 | dog |

다른 점은 무엇입니까?

답변

4

일부 RE 엔진에서는 RE에서 사용할 때 이러한 문자를 이스케이프하지 않아도되도록 다른 문자를 사용할 수 있습니다. 후자는 종종 읽을 수

sed 's/\/path\/to\/directory/xx/g' 
sed 's?/path/to/directory?xx?g' 

: 예를 들어

, sed와 함께, 당신이 중 하나를 사용할 수 있습니다. 전자는 "기울어 진 이쑤시개"라고도합니다. 펄을 사용하면 중 하나를 사용할 수 있습니다

$x =~ /#!\/usr\/bin\/perl/; 
$x =~ m!#\!/usr/bin/perl!; 

을하지만, 난 여전히 후자의 입술이 매우 복잡해 특히, 눈에 쉽게 주장한다. 글쎄, 눈이 쉽다. 펄 코드는 다음과 같을 수있다 :

5

이것은 하나의 정규식의 맛에서 다음까지 매우 다양하다. 예를 들어 JavaScript는 정규 슬래시 (또는 solidus)를 정규식 리터럴의 구분 기호로 사용할 수 있지만 Perl에서는 구두점 문자를 사용할 수 있습니다.보다 최신 버전에서는 «». 당신이 중괄호, 괄호, 또는 위의 이중 화살표 따옴표와 같은 균형 잡힌 쌍으로 문자를 사용할 때, 그들은 제대로 균형해야 :

m«\d+» 
s{foo}{bar} 

루비는 또한 당신이 %r 접두사를 사용하는 경우 다른 구분 기호를 선택할 수 있습니다, 하지만 균형 구분 기호 나 비 ASCII 문자로 확장되는지는 알 수 없습니다. 많은 언어가 정규 표현식을 전혀 지원하지 않습니다. 예를 들어, 문자열 리터럴로 정규식을 작성하십시오.

r'\d+' // Python 
@"\d+" // C# 
"\\d+" // Java 

Java 버전에서는 이중 백 슬래시에 유의하십시오. 이는 문자열이 Java 컴파일러에 의해 한 번, Pattern 클래스의 compile() 메서드에 의해 한 번 두 번 처리되기 때문에 필요합니다. 다른 대부분의 언어는 "원시"또는 "축 어적"형태의 문자열 리터럴을 제공하지만 이러한 역 슬래시를 제거합니다.

그리고 PHP가 있습니다. 그것의 preg regex 함수는 다양한 구분 기호를 포함하여 Perl의 정규식을 모방하는 PCRE 라이브러리 위에 구축됩니다. 마지막으로

'/\d+/g' // match modifiers go after the slash but inside the quotes 
"{\\d+}" // double-quotes may or may not require double backslashes 

할 심지어 언어 정규식 리터럴을 지원 참고 : 그들은 정규식과 같이 문자열 리터럴에 포함 된 리터럴 것처럼 당신이 그들을 작성해야하므로 그러나, PHP 자체는 정규식 리터럴을 지원하지 않습니다 보통 Perl의 s/…/…/ 구조와 같은 것을 제공하지 마십시오. 가장 가까운 함수는 첫 번째 인수로 정규 표현식을 사용하고 두 번째 표현식으로 문자열 리터럴을 사용하는 함수 호출입니다.