2013-06-11 2 views
2

직렬화 된 문자열에 신호 플래그가 몇 개 있으며 사용자가 특정 작업을 요청하면 문자열에서 플래그를 제거해야합니다. 아래 문자열에 대한 모든 경우에 사용할 수있는 정규식을 찾을 수 없습니다. RegExp는 JavaScript에서 부분 문자열을 바꿉니다.

var flags = "out:ab,bc,bcc,cd"; 

내가

flags.replace(/[:,]bc\b/, ""); 

결과 멋지다 out:ab,bcc,cd이지만, AB를 제거 할 때 내가 잘못이다 outbc,bcc,cd를 얻을 것이다 (예를 들어, BC 플래그를 제거) 가지고 가장 가까운 것입니다. 결과는 항상 직렬화 된 문자열을 유지해야합니다. out:flag1,flag2 하위 패턴 캡처를 시도했지만 전반적인 작동 콤보를 찾을 수 없습니다.

- 대한 추가 정보 : 플래그 내가 그것을 제거해야합니다 존재하는 경우

플래그, 0/1 신호입니다.

Out :은 작동 모드이며 In :의 반대입니다 (두 번째 플래그 그룹). 간단히 말하자면, Out은 "모두 허용하지만 블랙리스트에 넣기"입니다. In :은 "모두 거부하지만 화이트리스트"입니다. 앱은 어느 모드에서나 실행할 수 있습니다. ab, bc, cd ...는 샘플 알파벳 키입니다.

+0

그래서 "플래그"는 무엇입니까? '밖으로'무엇입니까? 예상되는 결과는 무엇입니까? 그건 조금은 분명해. – elclanrs

+0

무언가를 매치하고 바꿀 필요가 없다면 [lookaround] (http://www.regular-expressions.info/lookaround.html) – Barmar

+0

@elclanrs를 사용하십시오. Barmar 깃발을 제거해야합니다. 일치하지 않습니다. –

답변

2

사용 non-capturing parentheses : MDN의 Regular Expressions에서

var q = ['cd', 'bc'].join('|'), 
    re = new RegExp('(?:[:]('+q+'))|(,('+q+')(?=,))|(,('+q+')$)', 'g'), 
    flags = "out:ab,bc,bcc,cd"; 
flags.replace(re, ''); 
=> "out:ab,bcc" 

는 :

(? x)의 일치 'X'하지만 경기를 기억하지 않습니다. 괄호는 비 포획 괄호라고하며 정규 표현식 연산자가 작동하는 하위 표현식을 정의 할 수 있습니다. 샘플 표현식/(?: foo) {1,2} /를 고려해보십시오. 캡처하지 않는 괄호가 없으면 {1,2} 문자는 'foo'의 마지막 'o'에만 적용됩니다. 캡처 괄호를 사용하면 {1,2}가 전체 단어 'foo'에 적용됩니다.


편집 : 정규 표현식

/(?:[:](cd|bc))|(,(cd|bc)(?=,))|(,(cd|bc)$)/g 

에 대한 설명 파이프로 구분 된 세 개의 섹션이 있습니다. ?:[:](cd|bc)은 세미콜론 바로 다음에 플래그를 포함합니다. ,(cd|bc)(?=,)은 일치하는 표현식에서 앞의 쉼표를 포함하여 쉼표 사이의 플래그를 포함합니다. ,(cd|bc)$은 문자열의 끝에 플래그를 포함하며 앞의 쉼표도 포함합니다.


편집 2 : 정규식을 고정

, 일치시킬 플래그 q를 교체합니다.

+0

'ab'를 제거해도 여전히 : : –

+0

제가 생각합니다 :/(? : \ bab \ b (? :,)?) | (, ab (?=,)) | (, ab $)/g' 한 번에 두 개 이상을 제거해야하는 유스 케이스가 없으므로 첫 번째 섹션을 변경하고 OR를 제거했습니다. –

+1

또한,/((?: ab | bcc | cd), | (ab : bcc | cd) (?/g' -> http://jsfiddle.net/dXtDu/ – benastan

관련 문제