2013-08-08 3 views
2

대화식 양식을 만들 때 사용자가 제출 한 정규식을 파싱하고 각 정규식에서 일치하는 항목을 찾아 색인을 가져와야합니다 (캡처 그룹이 시작되는 곳).)를 사용하여 원래 문자열을 수정하십시오 (예 : 캡처 주위에 <strong> 태그를 추가한다고 가정 해보십시오).
결국 ip:(.+);port:(\d+)ip:<strong>(.+)</strong>;port:<strong>(\d+)</strong>으로 수정할 수 있기를 바랍니다.모든 항목을 정규식으로 일치시키고 문자열로 색인을 가져옵니다.

// Called somewhere after user entered every regex he wants 
$('input.regex').each(function() { 
    pattern = $(this).val(); // for non jQuery guys: just returns the content of the input 
    captures = pattern.match(/(\([^\(\)]+\))/g); 
    for(idx in captures) { 
     console.log(captures[idx]); 
    } 
}); 

이 모든 캡처 그룹을 찾을 날 (하위 그룹을 입력 할 수있는 사용자를 인정 반환 ... 그래 이미 약간의 두통을 줄 수있는 정규식 :

은 현재 내가 코드의이 작은 조각이 - ip:(.+);port:(\d+)

  • , 밖으로 출력 (.+)ip:(?P<sourceip>[\d\.]);port:(\d{2,5})(\d+)
  • : 나는 몇 가지 예에서 실행하는 경우)) 나는 순간 원하는 것을 얻을 수 덧붙여서 (?P<sourceip>[\d\.])(\d{2,5})

이제 각 캡처의 시작 인덱스를 얻는 것이 좋습니다. 나는 indexOf가 있다는 것을 알고 있지만 여러 번 같은 포획을 할 수 있습니다. 예를 들어

  • id1:(\d+);id2:(\d+) 현재 (\d+)(\d+) 및 출력한다. [{'match': '(\d+)', 'index': 4}, {'match': '(\d+)', 'index': 14}] : ... 첫 번째 인덱스하지만 두 번째를 쉽게 얻을 수

이 유사한 구조를 얻을 가능성이 있습니까? 일부 문자열 조작으로이 작업을 수행 할 수 있지만 더 단순한 (그리고 더 깨끗한) 방법이 있는지 알고 싶습니다.

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec이 한 번 봐 가지고 ['하려면 string.replace을 (, 기능() {...})'(https : //로 개발 .mozilla.org/ko-ko/docs/Web/JavaScript/Reference/Global_Objects/String/replace) – Andreas

+0

캡쳐 목록을 유지하고 싶습니다. 나는'string.replace'가 이것에 적절하다고 생각하지 않는다 :/ –

+0

@MaximeLorant는 ['string.match (regexp)'] (https://developer.mozilla.org/en-US/docs/)에서 살펴 본다. 웹/JavaScript/Reference/Global_Objects/String/match) –

답변

2

이 경우 RexExp.exec()를 사용합니다. RexExp에서 작동하고 문자열과 일치하지만 가장 중요한 것은 각 일치 항목의 배열을 반환합니다.이 배열은 이와 같이 반복 될 수 있습니다.

var match; //Match object. 
var matches = []; //Matches return, Array filled with match records. 

var regex = "..."; //Current Regex. 
var string = "..."; //Current String. 

while((match = regex.exec(string)) !== null){ 
    var matchRecord = {}; 
    matchRecord.match = regex; 
    matchRecord.index = match.index; //Might want to increment by 1 to make Human Readable? 
    matches.push(matchRecord); 
} 

참고 : 여기 regexp.exec에 대한 자세한 정보 :

+0

괜찮습니다. 내가'exec()'를 사용하려고했을 때 나는 항상'! =='테스트를 생략했기 때문에 무한 루프가 발생합니다. 감사! –

관련 문제