2013-02-02 3 views
0

기본적으로 내 프로그램은 임의의 공백, 탭 및 기타 공백 단위 (줄 바꿈뿐만 아니라 많은 수의)로 가득 찬 텍스트 입력을받습니다.정규식 문제 - 알 수없는 공백

나는 성공적으로 모든 탭을 제거해야 ...

// Parse the input box into an array 
var inputArr = document.getElementById("inputBox").value.split(/[\t]/); 

이제 텍스트가 다음과 같이 보입니다 ...

"더미 필드 그룹을 숨기기위한,,,,,,, * 역할, 이동하려면, 축소 섹션 개요,,,, 이름, 미상, 존, 세부 사항, 고객, 존 도우 사

내 문제 : 나는 스위치가 ...

switch(inputArr[i]) { 
몇 가지 사례를 가지고

...

 case ("Name" || "Name " || " Name" || " Name "): 
      if(inputArr[i - 1] == ("Summary" || "Summary " || " Summary" || " Summary ")) { 
       contNameBool = true; 
       break; 
      } 
      break; 
     case ("Details" || "Details " || " Details" || " Details "): 
      if(contNameBool == true) { 
       contNameBool = false; 
       break; 
      } else if(contNameBool == false && compNameBool == true) { 
       compNameBool = false; 
       break; 
      } 
      break; 
     case ("Customer" || "Customer " || " Customer" || " Customer "): 
      if(inputArr[i - 1] == "Details") { 
       contNameBool = false; 
       compNameBool = true; 
       break; 
      } 
      break; 
     case "Address": 
      if(inputArr[i - 1] == "Profile") { 
       compNameBool = false; 
       emailBool = true; 
       break; 
      } 
      break; 
     case ("VISA" || "MASTERCARD" || "AMERICAN" || "DISCOVER"): 
      emailBool = false; 
      break; 
     case "Show": 
      if(inputArr[i + 1] == "next" && inputArr[1 + 2] == "row") { 
       accountLinesArray.length = inputArr[i - 1]; 
       for(j = 0; j < accountLinesArray.length; j++) { 
        accountLinesArray[j] = new account(); 
       } 
       break; 
      } 
      break; 
     case "Order": 
      if(inputArr[i + 1] == "ID" && inputArr[i + 2] == "MRC") { 
       accountsBool = true; 
       break; 
      } 
      break; 

당신은 아마 알 수 있듯이, 내가 본문에 특정 키워드를 파악하고 그에 따라 몇 가지 논리 값을 전환 할 수 내 프로그램을 얻기 위해 노력하고 있어요. switch 문은 조건을 구성하는 방법에 관계없이 어떤 경우에도 적용되지 않습니다. 예를 들어 ...

case ("Name" && "Name " && " Name" && " Name "): 

||을 (를) 사용하더라도 트리거하지 않습니다.

누구든지 게시하기 전에 난 내 코드가 엉성함을 잘 알고있다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

3

먼저 탭으로 만 나눕니다. "이름", "이름은"이름 "을 확인 할 필요가 없습니다 있도록

var inputArr = document.getElementById("inputBox").value.split(/\s+/); 

이, 당신이 처리 할 필요가 경우의 수를 줄일 수 있습니다 : 공백 문자의 시퀀스를 분할하려면 다음을 수행 "또는"이름 ", 그냥"이름 ":

case "Name": 
    ... 
    break; 

둘째, 이것은 당신이 (아래 설명 참조) 기다리고있어로하지 않습니다

inputArr[i - 1] == ("Summary" || "Summary " || " Summary" || " Summary ") 

을하지만, 위의 첫 번째 변화 "요약"과 비교할 수 있습니다.

셋째, 당신은 완전히 다른 값에 일치시킬 않는 경우에, 당신은이 작업을 수행 할 수 있습니다

case "VISA": 
case "MASTERCARD": 
case "AMERICAN": 
case "DISCOVER": 
    emailBool = false; 
    break; 

마지막으로, 당신은 정말 당신의 전체적인 접근 방식을 다시 생각해야하지만 더 구체적인없이, 그것은 하드의 그것에 대해 의미있는 조언을 해주세요.

행운을 빕니다!

자바 스크립트에서

는, null 이외의 문자열이 같은 사실이고 || 계산 및 &&는 단락 회로 평가를 사용할 수 있습니다

EDIT (왜 inputArr[i - 1] == ("Summary" || "Summary " || ...이 작동하지 않습니다). 예를 들어 ("Name" || " Name") get은 "Name"이 참이므로 "Name"으로 계산되므로 나머지 방정식은 평가할 필요가 없습니다.마찬가지로 ("Name" && " Name")"Name"이 true이므로 " Name"과 같을 것이므로 " Name"도 마찬가지이며 다음 문장으로 이동하여 명령문의 끝입니다.

(inputArr[i - 1] == "Summary") || (inputArr[i - 1] == "Summary ") || ... 

또는 정규식을 사용하여 더 간단하게 할 수있다 : 같은 일을 할 당신이 필요가 시도했던 일을하기 위해 레이의 제안을 적용한 후

!!inputArr[i - 1].match("Summary").length 
// Be careful though, as this could also match something like "NotASummaryDude" 
+0

답장을 보내 주셔서 감사합니다. 실제로 탭으로 분할해야하고 모든 공백이 아닌 "탭"이라는 뜻의 "공백"을 실수로 넣었습니다. 모든 탭을 제거하면 필자의 프로그램이 어떻게 빈 필드를 식별 할 수 있는지 알지 못합니다. – Mrow

0

을, 당신은 또한 제거 할 수 있습니다 배열의 빈 요소 :

for (var i=inputArr.length-1; i>=0; i--){ 
    if (inputArr[i] == '' || !inputArr[i].match(/[^\s]/)) inputArr.splice(i,1) 
} 
+0

이것을 구현하려고 시도했지만 코드가 inputArr [i] = inputArr [i] .split (/ \ s + /) 다음에 나올 때 오류가 발생합니다. 어떤 아이디어? – Mrow

+0

코드를 보지 않고 말하기는 어렵지만 inputArr [i] .split (/ \ s + /)는 배열 요소 'i'를 나눠서 inputArr [i] 자체가 배열이됩니다. 아마도 코드는 정규 표현식을 문자열이 아닌 배열에 적용하려고 시도하고 있습니까? –