[javascript] 문자열에서 큰 따옴표를 제거하고 싶습니다.

""문자열 주위 를 제거하고 싶습니다 .

예를 들어 문자열이 "I am here"다음 과 같은 경우 에만 출력하고 싶습니다 I am here.



답변

가정 :

var someStr = 'He said "Hello, my name is Foo"';
console.log(someStr.replace(/['"]+/g, ''));

그 트릭을해야합니다 … (목표가 모든 큰 따옴표 를 대체 하는 경우 ).

작동 방식은 다음과 같습니다.

  • ['"]작은 따옴표와 큰 따옴표 모두와 일치하는 문자 클래스입니다. "큰 따옴표 만 일치하도록 이것을 바꿀 수 있습니다 .
  • +: 앞의 char-class에 의해 정의 된 하나 이상의 따옴표, 문자 (선택 사항)
  • g: 글로벌 플래그. 이것은 JS에게 정규 표현식을 전체 문자열에 적용하도록 지시합니다. 이를 생략하면 단일 문자 만 교체합니다.

주어진 문자열 (즉, 쌍) 주위의 따옴표를 제거하려고하면 약간 까다로워집니다. 둘러보기 어설 션을 사용해야합니다.

var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove foo delimiting quotes
str = 'remove only "foo" delimiting "';//note trailing " at the end
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove only foo delimiting "<-- trailing double quote is not removed

정규식 설명 :

  • ": 리터럴, 모든 리터럴과 일치 "
  • (: 그룹 캡처를 시작합니다. 괄호 ( ()) 사이에있는 것은 캡처되어 대체 값으로 사용될 수 있습니다.
  • [^"]+: 문자 클래스, 1 회 이상을 제외한 모든 문자 와 일치"
  • (?="): 폭이 0 인 포지티브 예측 어설 션. 이전 일치는 "리터럴 이 오는 경우에만 유효합니다.
  • ): 엔드 캡처 그룹, 우리는 오프닝 폐쇄 사이의 모든 것을 캡처했습니다 "
  • ": 다른 리터럴, cf list item one

대체는입니다 '$1'. 이것은 첫 번째 캡처 된 그룹에 대한 역 참조입니다 [^" ]+. 또는 큰 따옴표 사이에 있습니다. 이 패턴은 따옴표와 그 사이의 내용과 일치하지만 따옴표 사이의 내용으로 만 대체하므로 효과적으로 제거합니다.
그것이하는 일은 some "string with" quotes->로 대체 "string with"됩니다-> string with. 따옴표가 사라졌습니다.

따옴표가 항상 문자열의 시작과 끝에있을 경우 다음을 사용할 수 있습니다.

str.replace(/^"(.+(?="$))"$/, '$1');

입력으로 remove "foo" delimiting ", 출력은 변경되지 않지만의 입력 문자열을 변경합니다 "remove "foo" delimiting quotes", 당신은 될 겁니다 remove "foo" delimiting quotes출력한다.

설명:

  • ^": 문자열의 시작과 일치 ^하고를 ". 문자열이로 시작하지 않으면 "여기에서 표현식이 이미 실패하고 대체되지 않습니다.
  • (.+(?="$)): 긍정적 인 예측이 true 인 경우 큰 따옴표를 포함하여 모든 것을 일치시키고 캡처합니다.
  • (?="$): 긍정적 인 예측은 위와 거의 동일 하며 문자열의 끝 " 이어야 함만 지정 합니다 ( $=== end).
  • "$: 종료 따옴표와 일치하지만 캡처하지 않습니다

교체는 이전과 같은 방식으로 수행됩니다 : 일치하는 따옴표 (마침 및 닫는 따옴표 포함)를 안에있는 모든 것으로 바꿉니다. 전체 문자열을 처리하기 때문에이 표현식은 한 번만 적용되므로 플래그 (글로벌 BTW의 경우)를
생략 한 것을 알 수 있습니다 g.
거의 같은 일을하는 더 쉬운 정규식 (정규식 컴파일 / 적용 방법의 내부 차이점이 있음)은 다음과 같습니다.

someStr.replace(/^"(.+)"$/,'$1');

이전 ^"과 마찬가지로 "$문자열의 시작과 끝에서 구분 따옴표를 (.+)일치 시키고 그 사이의 모든 것을 일치시켜 캡처합니다. 나는 위의 것과 함께이 정규 표현식을 시도했지만 (견해 주장과 함께) 내 놀람에 따르면이 정규 표현식은 약간 느리다는 것을 알았습니다. 내 생각에 둘러보기 어설 션은 엔진 "이 문자열 끝에 없음이 있다고 판단하자마자 이전 표현식이 실패하게 만듭니다. 아, 그러나 이것이 당신이 원하거나 필요로하는 것이라면, 계속 읽으십시오 :

그러나이 마지막 경우 훨씬 안전하고 빠르며 유지 관리가 가능 하며이 작업을 수행하는 것이 좋습니다.

if (str.charAt(0) === '"' && str.charAt(str.length -1) === '"')
{
    console.log(str.substr(1,str.length -2));
}

여기서 문자열의 첫 번째 문자와 마지막 문자가 큰 따옴표인지 확인하고 있습니다. 그들이 있다면, 나는 첫 번째 문자와 마지막 문자 substr잘라 내기 위해 사용 하고 있습니다. 문자열은 인덱스가 0이므로 마지막 문자는 charAt(str.length -1)입니다. substr첫 번째는 하위 문자열이 시작되는 오프셋이고 두 번째는 길이입니다. 우리는 마지막 문자를 원하지 않기 때문에 첫 번째 문자를 원할 때보 다 길이가 str.length - 2입니다. 쉬운-피지.

:

둘러보기 어설 션에 대한 자세한 내용은 여기 에서 확인할 수 있습니다 .Regex
는 매우 유용하며 (그리고 IMO 재미) 처음에는 약간 방해가 될 수 있습니다. 다음은 더 자세한 내용과 문제에 대한 리소스 링크 입니다.
정규식을 사용하는 데 익숙하지 않다면 다음을 사용하는 것이 좋습니다.

var noQuotes = someStr.split('"').join('');

문자열에 따옴표가 많으면 정규 표현식을 사용하는 것보다 빠를 수도 있습니다


답변

str = str.replace(/^"(.*)"$/, '$1');

이 정규 표현식은 따옴표가 문자열의 첫 번째 및 마지막 문자 인 경우에만 따옴표를 제거합니다. F.ex :

"I am here"  => I am here (replaced)
I "am" here  => I "am" here (untouched)
I am here"   => I am here" (untouched)


답변

문자열이 제거하려는 시작과 끝에 하나의 따옴표 (또는 다른 단일 문자)가있는 경우 :

str = str.slice(1, -1);

slice 정규식보다 오버 헤드가 훨씬 적습니다.


답변

데이터를 제어 할 수 있고 큰 따옴표가 문자열을 둘러싸고 있으므로 (문자열 안에 나타나지 않음) 문자열은 정수입니다 …

"20151212211647278"

또는 이와 비슷하게 주변 따옴표를 잘 제거합니다.

JSON.parse("20151212211647278");

그러나 틈새 시장의 요구에 부응하는 보편적 인 답변은 아닙니다


답변

경계 따옴표 만 제거하려는 경우 :

function stripquotes(a) {
    if (a.charAt(0) === '"' && a.charAt(a.length-1) === '"') {
        return a.substr(1, a.length-2);
    }
    return a;
}

이 방법은 문자열이 보이지 않으면 문자열을 건드리지 않습니다 "text in quotes".


답변

시작 또는 끝에서 따옴표 만 제거하려면 다음 정규식을 사용하십시오.

'"Hello"'.replace(/(^"|"$)/g, '');


답변

정규식으로 표현하기 쉬운 방식으로 문제를 다시 설명하려면 :

0 또는 하나의 선행 큰 따옴표와 0 또는 하나의 후행 큰 따옴표 사이에 포함 된 문자의 하위 문자열을 가져옵니다.

이를 수행하는 정규 표현식은 다음과 같습니다.

  var regexp = /^"?(.+?)"?$/;
  var newStr = str.replace(/^"?(.+?)"?$/,'$1');

정규 표현식을 세분화하십시오.

  • ^"? 0 또는 1 개의 선행 큰 따옴표에 대한 욕심 일치
  • "?$ 0 또는 1 개의 후행 인용 부호에 대한 욕심 일치
  • 사람들은이 북 엔드 다른 모든 문자가 아닌 욕심 캡처, (.+?)같은 대상을 포함 할 것이다 $1.

이것은 다음으로 돌아옵니다 delimited "string" here.

str = "delimited "string" here"  // ...
str = '"delimited "string" here"' // ...
str = 'delimited "string" here"' // ... and
str = '"delimited "string" here'