정규식을 사용하여 JavaScript의 문자열에서 구두점을 모두 제거하려면 어떻게합니까?


152

영숫자가 아닌 문자가있는 문자열이있는 경우 :

"This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation"

JavaScript로 문장 부호없는 버전을 얻으려면 어떻게해야합니까?

"This is an example of a string with punctuation"

답변:


211

문자열에서 특정 구두점을 제거하려면 원하는 것을 정확하게 명시 적으로 제거하는 것이 가장 좋습니다.

replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g,"")

위의 작업을 수행해도 지정한대로 문자열이 반환되지 않습니다. 미친 문장 부호를 제거하여 남은 여분의 공백을 제거하려면 다음과 같은 작업을 수행하려고합니다.

replace(/\s{2,}/g," ");

내 전체 예 :

var s = "This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation";
var punctuationless = s.replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g,"");
var finalString = punctuationless.replace(/\s{2,}/g," ");

Firebug Console에서 코드를 실행 한 결과 :

대체 텍스트


4
정규 표현식의 중괄호는 앞의 수량자를 적용 하므로이 경우 2 ~ 100 사이의 공백 문자 ( \s)를 단일 공백으로 바꿉니다 . 여러 개의 공백 문자를 하나로 축소하려면 다음과 같이 상한을 그대로 두십시오 replace(/\s{2,}/g, ' ').
Mike Partridge

13
구두점 교체 목록 ( @+?><[]+)에 문자를 몇 개 더 추가했습니다 replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()@\+\?><\[\]\+]/g, ''). 누군가가 아직 약간 더 완벽한 세트를 찾고 있다면.
timmfin

9
파이썬의 string.punctuation는 다음과 같이 문장 부호를 정의 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~또 다른 대안이 될 수 있도록, 더 나은 나를 위해 작동 어느 :replace(/['!"#$%&\\'()\*+,\-\.\/:;<=>?@\[\\\]\^_`{|}~']/g,"");
01AutoMonkey

1
@ AntoineLizée 오해의 소지가 있음에 동의합니다. 답변을 업데이트했습니다. 감사.
Mike Grace

2
나는 "그것으로 시도했다?" -나를 위해 작동하지 않습니다 ( regex101.com/r/F4j5Qc/1 ), 올바른 해결책은 다음과 같습니다 : /[.,\/#!$%\^&*;:{}=\-_`~ () \?] / g
Maxim Firsoff

129
str = str.replace(/[^\w\s]|_/g, "")
         .replace(/\s+/g, " ");

영숫자와 공백을 제외한 모든 문자를 제거한 다음 인접한 여러 문자를 단일 공백으로 축소합니다.

상해:

  1. \w 숫자, 문자 또는 밑줄입니다.
  2. \s 공백입니다.
  3. [^\w\s] 숫자, 문자, 공백 또는 밑줄이 아닌 것입니다.
  4. [^\w\s]|_ 밑줄을 다시 추가한다는 점을 제외하고 # 3과 같습니다.

72
또한 영어가 아닌 à, é, ö와 같은 완전 영숫자 문자와 키릴 문자 전체를 제거합니다.
Dan Abramov

5
@quemeful 동의하지 않습니다. 원래 질문은 "English only"를 지정하지 않습니다. SO는 전 세계적으로 사용되는 매우 국제적입니다. 영어를 사용하고 인터넷에 접속할 수있는 사람이라면 누구나 사용할 수 있습니다. 질문에 언어가 지정되어 있지 않으면 가정하지 않아야합니다. 우리는 2017 년에 있습니다.
Rolf

1
또한 영어 만 지원하더라도 이력서와 장소 또는 사람의 이름과 같은 대출 단어가 있으므로 Ramón Chloé 사이의 칸막이에서 San José (공식 철자법)에서 일한다고 말하는 사람의 능력을 어 기고 싶지 않을 것입니다.
Chris Adams

wouldn'tdon't
찰리

71

US-ASCII의 표준 문장 부호 문자는 다음과 같습니다. !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

유니 코드 구두점 (예 : 중괄호, 엠-대시 등)의 경우 특정 블록 범위에서 쉽게 일치시킬 수 있습니다. 일반 문장 블록입니다 \u2000-\u206F, 그리고 보충 문장 블록입니다\u2E00-\u2E7F .

합치면 제대로 탈출하면 다음과 같은 RegExp가 나타납니다.

/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,\-.\/:;<=>?@\[\]^_`{|}~]/

이는 구두점과 거의 일치해야합니다. 따라서 원래 질문에 대답하려면 다음을 수행하십시오.

var punctRE = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,\-.\/:;<=>?@\[\]^_`{|}~]/g;
var spaceRE = /\s+/g;
var str = "This, -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation";
str.replace(punctRE, '').replace(spaceRE, ' ');

>> "This is an example of a string with punctuation"

US-ASCII 소스 : http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#posix

유니 코드 소스 : http://kourge.net/projects/regexp-unicode-block


3
유니 코드 문장 부호의 경우 블록이 충분하지 않습니다. 일반적인 카테고리 구두점을 살펴 봐야합니다. 모든 구두점이 해당 블록에있는 것은 아닙니다. 예를 들어 라틴어 블록에는 많은 익숙한 구두점이 있습니다.
nhahtdh

15

/ [^ A-Za-z0-9 \ s] / g는 모든 구두점과 일치하지만 공백은 유지해야합니다. 따라서 .replace(/\s{2,}/g, " ")필요한 경우 추가 공간을 교체 하는 데 사용할 수 있습니다 . http://rubular.com/ 에서 정규식을 테스트 할 수 있습니다.

.replace(/[^A-Za-z0-9\s]/g,"").replace(/\s{2,}/g, " ")

업데이트 : 입력이 ANSI 영어 인 경우에만 작동합니다.


6
문자열이 ANSI 영어라고 가정합니다. 악센트 부호가있는 프랑스어 (àéô) 또는 독일어, 터키어는 프랑스어가 아닙니다. 유니 코드 아랍어, 중국어 등도 사라집니다.
Rolf

2
고마워, 그것에 대해 완전히 생각하지 않았다.
adnan2nd

10

나는 같은 문제를 겪었고,이 솔루션은 트릭을 수행했으며 매우 읽을 수있었습니다.

var sentence = "This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation";
var newSen = sentence.match(/[^_\W]+/g).join(' ');
console.log(newSen);

결과:

"This is an example of a string with punctuation"

속임수는 부정 세트 를 만드는 것이 었습니다 . 즉, 세트 내에 포함 [^abc]되지 않은 항목 ,a, b 또는 c 와 일치하지 않는 항목과 일치합니다.

\W이외의 단어는, 그래서 [^\W]+워드 아닌 그 어떤 것도 부정 할 문자 합니다.

_ (밑줄)을 추가하면이를 무시할 수 있습니다.

전역 적으로 적용 /g하면 문자열을 통해 구두점을 지울 수 있습니다.

/[^_\W]+/g

좋고 깨끗하다;)


1
또한이 방법으로 모든 새 줄을 공간으로 변경합니다.
nhahtdh

5
이 방법은 영어로만 작동하며 악센트 부호가있는 문자는 모두 제거됩니다.
NicolasBernier

@NicolasBernier 네, 100 % 정확합니다-JavaScript의 정규식 엔진은 실제로 상당히 절름발이입니다 ( stackoverflow.com/questions/4043307/… 참조 )-불행히도 더 복잡한 작업 (영어가 아닌 단어의 패턴을 만들기 위해)에는 공정한 시간이 걸립니다 더 많은 코드. 여전히 구두점을 제거하는 빠르고 간결한 정규 표현식의 경우 작동합니다. :)
jacobedawson

이것은 가장 단순했고 내 ​​목적을 잘 수행했습니다.
James Shrum

9

다른 사람들을 위해 여기에 넣겠습니다.

모든 언어에 대해 모든 구두점 문자를 찾습니다.

유니 코드 구두점 카테고리로 구성 $되며 괄호 및\-=_

http://www.fileformat.info/info/unicode/category/Po/list.htm

기본 교체 :

".test'da, te\"xt".replace(/[\-=_!"#%&'*{},.\/:;?\(\)\[\]@\\$\^*+<>~`\u00a1\u00a7\u00b6\u00b7\u00bf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d\u166e\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cc0-\u1cc7\u1cd3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e16\u2e18\u2e19\u2e1b\u2e1e\u2e1f\u2e2a-\u2e2e\u2e30-\u2e39\u3001-\u3003\u303d\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uaaf0\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a\ufe6b\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g,"")
"testda text"

공간으로 \ s를 추가했습니다.

".da'fla, te\"te".split(/[\s\-=_!"#%&'*{},.\/:;?\(\)\[\]@\\$\^*+<>~`\u00a1\u00a7\u00b6\u00b7\u00bf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d\u166e\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cc0-\u1cc7\u1cd3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e16\u2e18\u2e19\u2e1b\u2e1e\u2e1f\u2e2a-\u2e2e\u2e30-\u2e39\u3001-\u3003\u303d\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uaaf0\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a\ufe6b\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g)

문장 부호가 아닌 자아와 일치하도록 패턴을 반전시키기 위해 ^를 추가했습니다.

".test';the, te\"xt".match(/[^\s\-=_!"#%&'*{},.\/:;?\(\)\[\]@\\$\^*+<>~`\u00a1\u00a7\u00b6\u00b7\u00bf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d\u166e\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cc0-\u1cc7\u1cd3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e16\u2e18\u2e19\u2e1b\u2e1e\u2e1f\u2e2a-\u2e2e\u2e30-\u2e39\u3001-\u3003\u303d\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uaaf0\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a\ufe6b\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g)

히브리어와 같은 언어의 경우 작은 따옴표와 큰 따옴표를 제거하고 더 많은 생각을 할 수 있습니다.

이 스크립트를 사용하여 :

1 단계 : Firefox에서 제어를 U + 1234 숫자의 열을 선택하고 복사하십시오 .U + 12456은 영어를 대체하지 마십시오.

2 단계 (크롬에서 수행)는 텍스트 영역을 찾아서 붙여 넣은 다음 마우스 오른쪽 버튼을 클릭하고 검사를 클릭하십시오. 그러면 $ 0으로 선택한 요소에 액세스 할 수 있습니다.

var x=$0.value
var z=x.replace(/U\+/g,"").split(/[\r\n]+/).map(function(a){return parseInt(a,16)})
var ret=[];z.forEach(function(a,k){if(z[k-1]===a-1 && z[k+1]===a+1) { if(ret[ret.length-1]!="-")ret.push("-");} else {  var c=a.toString(16); var prefix=c.length<3?"\\u0000":c.length<5?"\\u0000":"\\u000000"; var uu=prefix.substring(0,prefix.length-c.length)+c; ret.push(c.length<3?String.fromCharCode(a):uu)}});ret.join("")

3 단계 첫 번째 문자 위에 여러 문자를 추가하거나 제거 할 수 있기 때문에 ASCII가 범위가 아닌 별도의 문자로 아스키를 복사했습니다.


7

유니 코드를 인식하는 언어에서 유니 코드 문장 부호 문자 속성은 \p{P}일반적으로 약어 \pP로 확장 할 수 있습니다.\p{Punctuation} 되며 가독성 위해 .

Perl 호환 정규식 라이브러리를 사용하고 있습니까?


8
불행히도 JS는 Perl과 호환되지 않습니다. 다른 문제는 이것을 테스트 할 때 @Quentin
Mike Grace

4
XRegExp 라이브러리를 사용하여이 확장 구문을 얻을 수 있습니다.
Eirik Birkeland

7

문자열에서 문장 부호를 제거하려면 P유니 코드 클래스를 사용해야합니다 .

그러나 JavaScript RegEx에서는 클래스가 허용되지 않으므로 모든 구두점과 일치해야하는이 RegEx를 사용해 볼 수 있습니다. 다음 범주와 일치합니다. Pc Pd Pe Pf Pi Po Ps Sc Sk Sm So 일반 구두점 보충 구두점 CJKSymbolsAndPunctuation CuneiformNumbersAndPunctuation.

JavaScript를 위해 정규 표현식을 생성 하는 이 온라인 도구 를 사용하여 작성했습니다 . 그것이 목표에 도달하는 코드입니다.

var punctuationRegEx = /[!-/:-@[-`{-~¡-©«-¬®-±´¶-¸»¿×÷˂-˅˒-˟˥-˫˭˯-˿͵;΄-΅·϶҂՚-՟։-֊־׀׃׆׳-״؆-؏؛؞-؟٪-٭۔۩۽-۾܀-܍߶-߹।-॥॰৲-৳৺૱୰௳-௺౿ೱ-ೲ൹෴฿๏๚-๛༁-༗༚-༟༴༶༸༺-༽྅྾-࿅࿇-࿌࿎-࿔၊-၏႞-႟჻፠-፨᎐-᎙᙭-᙮᚛-᚜᛫-᛭᜵-᜶។-៖៘-៛᠀-᠊᥀᥄-᥅᧞-᧿᨞-᨟᭚-᭪᭴-᭼᰻-᰿᱾-᱿᾽᾿-῁῍-῏῝-῟῭-`´-῾\u2000-\u206e⁺-⁾₊-₎₠-₵℀-℁℃-℆℈-℉℔№-℘℞-℣℥℧℩℮℺-℻⅀-⅄⅊-⅍⅏←-⏧␀-␦⑀-⑊⒜-ⓩ─-⚝⚠-⚼⛀-⛃✁-✄✆-✉✌-✧✩-❋❍❏-❒❖❘-❞❡-❵➔➘-➯➱-➾⟀-⟊⟌⟐-⭌⭐-⭔⳥-⳪⳹-⳼⳾-⳿⸀-\u2e7e⺀-⺙⺛-⻳⼀-⿕⿰-⿻\u3000-〿゛-゜゠・㆐-㆑㆖-㆟㇀-㇣㈀-㈞㈪-㉃㉐㉠-㉿㊊-㊰㋀-㋾㌀-㏿䷀-䷿꒐-꓆꘍-꘏꙳꙾꜀-꜖꜠-꜡꞉-꞊꠨-꠫꡴-꡷꣎-꣏꤮-꤯꥟꩜-꩟﬩﴾-﴿﷼-﷽︐-︙︰-﹒﹔-﹦﹨-﹫!-/:-@[-`{-・¢-₩│-○-�]|\ud800[\udd00-\udd02\udd37-\udd3f\udd79-\udd89\udd90-\udd9b\uddd0-\uddfc\udf9f\udfd0]|\ud802[\udd1f\udd3f\ude50-\ude58]|\ud809[\udc00-\udc7e]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83-\udd84\udd8c-\udda9\uddae-\udddd\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83c[\udc00-\udc2b\udc30-\udc93]/g;
var string = "This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation";
var newString = string.replace(punctuationRegEx, '').replace(/(\s){2,}/g, '$1');
console.log(newString)


5

en-US (미국 영어) 문자열의 경우 다음과 같이 충분합니다.

"This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation".replace( /[^a-zA-Z ]/g, '').replace( /\s\s+/g, ' ' )

UTF-8과 중국어 / 러시아어 및 모든 문자를 지원하는 경우 UTF-8 문자도이를 대체하므로 원하는 것을 지정해야합니다.


3

lodash를 사용하는 경우

_.words('This, is : my - test,line:').join(' ')

이 예

_.words('"This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation"').join(' ')

2

에 따라 문장 부호의 위키 백과의 목록 나는 구두점을 감지 다음 정규식을 구축했다 :

[\.’'\[\](){}⟨⟩:,،、‒–—―…!.‹›«»‐\-?‘’“”'";/⁄·\&*@\•^†‡°”¡¿※#№÷׺ª%‰+−=‱¶′″‴§~_|‖¦©℗®℠™¤₳฿₵¢₡₢$₫₯֏₠€ƒ₣₲₴₭₺₾ℳ₥₦₧₱₰£៛₽₹₨₪৳₸₮₩¥]


2
이 정규식을 사용하는 경우 정규식 구분 기호도 이스케이프해야합니다. 예를 들어 /(가장 일반적)을 사용하는 경우 다음과 같이 백 슬래시를 추가하여 위의 문자 클래스 내에서 이스케이프해야합니다 \/. 이것이 당신이 그것을 사용하는 방법입니다 : "String!! With, Punctuation.".replace(/[\.’'\[\](){}⟨⟩:,،、‒–—―…!.‹›«»‐\-?‘’“”'";\/⁄·\&*@\•^†‡°”¡¿※#№÷׺ª%‰+−=‱¶′″‴§~_|‖¦©℗®℠™¤₳฿₵¢₡₢$₫₯֏₠€ƒ₣₲₴₭₺₾ℳ₥₦₧₱₰£៛₽₹₨₪৳₸₮₩¥]+/g,""). 그건 그렇고, 나는 어디에서 백틱 (`)을 보지 못합니까?
Rolf

누락. 모든 문장 부호 목록을 찾기가 어려운 것 같습니다.
Alex

1

알파벳과 공백 만 유지하려면 다음을 수행하십시오.

str.replace(/[^a-zA-Z ]+/g, '').replace('/ {2,}/',' ')

8
구두점 이상의 것을 꺼내지 않습니까? 유니 코드 등?
Alex

3
" 영어 알파벳과 공백 만"을 의미 합니다
Rolf

0

당신이 무엇을 반환하려고하는지에 달려 있습니다. 나는 이것을 최근에 사용했다.

return text.match(/[a-z]/i);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.