2017-03-07 1 views
2

낙타의 단어 당 String을 분할해야하는 경우가 발생했습니다. 나는이 패턴을 사용하여 answer this question 유사한 분할 프로세스를 구현하고 있습니다 :이 테스트 세트가 발생 될 때까지원하는 지역의 단어 분할

split(/(?=[A-Z])/) 

다 괜찮 :

  • SalaryGrade - 급여 등급을
  • ParentChild - 부모 자식
  • 유지 보수 - 유지 보수
  • 송금 SPD - 송금 SPD
  • FBIAgent - 연방 수사 국 (FBI) 요원
  • FBIAgentNYDepartment - 연방 수사 국 (FBI) 요원 NY 부서

한 최대 세 작품을 잘하지만 6-4은 각각 "송금 SPD", "FBI 요원", "FBI 요원 NY 부"이어야합니다 .

연속 대문자를 한 단어로 처리하고 마지막 단어를 다음 단어의 시작으로 처리하는 방법으로 영역을 선택하려면 어떻게해야합니까? 나는 정직하게 일렬로 된 Regex를 좋아하지 않으며 모든 희망을 잃어 가고 있습니다. 나는 그 성능에 대해서뿐만 아니라 무차별 루프를 수행 할 계획이다.

편집 :이 사이트에서 문자열을 여기에서 분리하는 것과 관련하여 다른 질문과 달리이 함수를 사용하여 대문자가 아닌 문자와 대문자를 모두 사용하고 싶습니다.

+1

JS가 lookbehind를 지원하지 않거나 '/ (? <= [az]) (? = [AZ]) /'이면 충분했습니다. – Aaron

+2

'str.match (/ [AZ] +? ! [az]) | [AZ] [az] */g)' –

+0

@Aaron 나는 방금 너무 오래 전에 훑어 보았다. 그래서 나는 그것을 반복 할 생각이다. – Gideon

답변

2

당신은 여기 일치 접근 방식을 사용할 수있다

  • [A-Z]+(?![a-z]) - 또는
  • [A-Z][a-z]* - - 1+ 대문자 ASCII 문자는 소문자 ASCII 문자
  • | 뒤를 NOT 대문자 ASCII 문자가 0+ 소문자 ASCII 문자

var ss = ['SalaryGrade','ParentChild','Maintenance','RemittanceSPD','FBIAgent','FBIAgentNYDepartment']; 
 
var rx = /[A-Z]+(?![a-z])|[A-Z][a-z]*/g; 
 
for (var s = 0; s < ss.length; s++) { 
 
    console.log("Testing: ", ss[s], "... "); 
 
    console.log("Matched: ", JSON.stringify(ss[s].match(rx))); 
 
}
에 따라

FBIAgent의 경우 FBI[A-Z]+(?![a-z])과 일치합니다. 정규식 엔진이 FBIA 대문자를 잡고 대문자가 소문자로 뒤 따르지 않는 위치로 역 추적하기 때문에 역 추적으로 인해 FBI이됩니다. 일치하고 A 글자는 다음 반복시에도 계속 사용됩니다.

-1

다음은 도움이 될 것입니다

str.match(/[A-Z]+(?![a-z])|[A-Z][a-z]*/g) 

regex demo

세부를 참조하십시오 :

/(?=[A-Z][a-z])/ 
+0

대문자가 네드에 있으면 효과가 없습니다. '송금 SPD' – Gideon