2012-01-19 2 views
2

나는 내가 작성한 스크립트 #에서이문자열을 이스케이프 처리하면 정규식이 엉망이되는 이유는 무엇입니까?

function ParseJsonDate(input) { 
    var tmp = +input.replace(/\/Date\((-?\d+)\)\//, '$1'); 
    jsonDate = new Date(tmp); 

    return jsonDate; 
} 

와 유사한 자바 스크립트 코드를 생성하기 위해 노력하고있어이 :

StringFunctions.parseJsonDate = function StringFunctions$parseJsonDate(input) { 
    /// <param name="input" type="String"> 
    /// </param> 
    /// <returns type="Date"></returns> 
    var pattern = unescape('/\\/Date\\((-?\\d+)\\)\\//'); 
    var regex = new RegExp(pattern); 
    var tmp = input.replace(regex, '$1'); 
    var milliseconds = Number.parse(tmp); 
    var jsonDate = new Date(milliseconds); 
    return jsonDate; 
} 

이 모양이로 컴파일

public static Date ParseJsonDate(string input) 
    { 
     string pattern = @"/\/Date\((-?\d+)\)\//".Unescape(); 
     RegularExpression regex = new RegularExpression(pattern); 
     string tmp = input.ReplaceRegex(regex, "$1"); 
     Number milliseconds = Number.Parse(tmp); 
     Date jsonDate = new Date(milliseconds); 
     return jsonDate; 
    } 

그래도 디버거를 사용하여 단계를 밟으면 이스케이프 처리되지 않은 문자열에서 생성 된 RegExp 객체는 완전히 다릅니다.

아이디어가 있으십니까?

답변

2

에서 앞뒤 문자 /은 정규식의 일부가 아니며 정규 표현식의 구분 기호입니다. 그들은 자바 스크립트 인터프리터에게 정규 표현식이 시작하고 끝나는 곳을 알려주며, 따옴표처럼 문자열 리터럴을 구분합니다.

스크립트 # 코드에서 정규 표현식이 아닌 문자열 리터럴 형식으로 정규식을 만듭니다. 컴파일러는 앞과 뒤의 /이 리터럴 슬래시와 일치한다고 생각합니다. 사라진 사람들은 정규식에서 슬래시를 피할 필요가 없습니다.

@"/Date\((-?\d+)\)/" 

아이러니하게도,이 정규식 시작 /로 끝나는 문자열이 일치 : 그것은 당신을 떠난다. 그게 당신의 의도 였지?

+0

그 트릭을했습니다. 마지막으로 "패턴"은 다음과 같습니다 :'@ "\/Date \ ((-? \ d +) \) \ /"' –

2

문자열에서 정규 표현식을 작성할 때 / 자의 앞뒤 문자가 필요하지 않습니다. 정규식 파서 당신이 당신이 선도적 인 패턴 주위 / 후행를 일치시킬 것을 의미 가정하기 때문에 사실, 당신이하지 필요을 할뿐만 아니라, 당신은 은 그들를 원하지 않는다.

관련 문제