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

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

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

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

"This is an example of a string with punctuation"



답변

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

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에서 코드를 실행 한 결과 :

대체 텍스트


답변

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

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

상해:

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

답변

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


답변

/ [^ 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 영어 인 경우에만 작동합니다.


답변

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

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

좋고 깨끗하다;)


답변

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

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

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

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가 범위가 아닌 별도의 문자로 아스키를 복사했습니다.


답변

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

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