자바 스크립트 및 정규식 : 문자열을 분할하고 구분 기호 유지
문자열이 있습니다.
var string = "aaaaaa<br />† bbbb<br />‡ cccc"
그리고이 문자열을 구분 기호 <br />
뒤에 특수 문자 로 나누고 싶습니다 .
이를 위해 다음을 사용합니다.
string.split(/<br \/>&#?[a-zA-Z0-9]+;/g);
구분 기호를 잃어 버리는 것을 제외하고는 필요한 것을 얻고 있습니다. 예 : http://jsfiddle.net/JwrZ6/1/
구분자를 어떻게 유지할 수 있습니까?
정규식이 특수 문자가 존재하지만 실제로 일치하지 않는다고 주장하도록 긍정적 인 예견을 사용 합니다.
string.split(/<br \/>(?=&#?[a-zA-Z0-9]+;)/g);
실제 사용 방법 :
var string = "aaaaaa<br />† bbbb<br />‡ cccc";
console.log(string.split(/<br \/>(?=&#?[a-zA-Z0-9]+;)/g));
업데이트 : 오타 수정 ( ;
예측 괄호 내부에서 리터럴 이동 )
나는 비슷하지만 약간 다른 문제가 있었다. 어쨌든, 다음은 구분자를 유지할 위치에 대한 세 가지 시나리오의 예입니다.
"1、2、3".split("、") == ["1", "2", "3"]
"1、2、3".split(/(、)/g) == ["1", "、", "2", "、", "3"]
"1、2、3".split(/(?=、)/g) == ["1", "、2", "、3"]
"1、2、3".split(/(?!、)/g) == ["1、", "2、", "3"]
"1、2、3".split(/(.*?、)/g) == ["", "1、", "", "2、", "3"]
경고 : 네 번째는 단일 문자 분할에만 작동합니다. ConnorsFan 은 대안을 제시 합니다 .
// Split a path, but keep the slashes that follow directories
var str = 'Animation/rawr/javascript.js';
var tokens = str.match(/[^\/]+\/?|\//g);
구분 기호를 괄호로 묶으면 반환 된 배열의 일부가됩니다.
string.split(/(<br \/>&#?[a-zA-Z0-9]+);/g);
// returns ["aaaaaa", "<br />†", "bbbb", "<br />‡", "cccc"]
유지하려는 부분에 따라 일치하는 하위 그룹을 변경하십시오.
string.split(/(<br \/>)&#?[a-zA-Z0-9]+;/g);
// returns ["aaaaaa", "<br />", "bbbb", "<br />", "cccc"]
string.split (/ () & #? [a-z0-9] +; / gi); 문자의 대소 문자를 무시하여 표현식을 개선 할 수 있습니다.
그리고 다음과 같이 미리 정의 된 그룹에 대해 일치시킬 수 있습니다 : \d
같음 [0-9]
및 \w
같음 [a-zA-Z0-9_]
. 이것은 당신의 표정이 이렇게 보일 수 있음을 의미합니다.
string.split(/<br \/>(&#?[a-z\d]+;)/gi);
JavaScriptKit에 좋은 정규 표현식 참조가 있습니다.
여기에 대답했습니다 .JavaScript Split Regular Expression은 구분 기호를 유지합니다.
정규식 예제에서 (? = pattern) lookahead 패턴 사용
var string = '500x500-11*90~1+1';
string = string.replace(/(?=[$-/:-?{-~!"^_`\[\]])/gi, ",");
string = string.split(",");
이것은 당신에게 다음과 같은 결과를 줄 것입니다.
[ '500x500', '-11', '*90', '~1', '+1' ]
직접 분할 가능
string = string.split(/(?=[$-/:-?{-~!"^_`\[\]])/gi);
같은 결과를주는
[ '500x500', '-11', '*90', '~1', '+1' ]
확장 함수는 문자열을 부분 문자열 또는 RegEx로 분할하고 구분 기호는 두 번째 매개 변수의 앞 또는 뒤에 배치됩니다.
String.prototype.splitKeep = function (splitter, ahead) {
var self = this;
var result = [];
if (splitter != '') {
var matches = [];
// Getting mached value and its index
var replaceName = splitter instanceof RegExp ? "replace" : "replaceAll";
var r = self[replaceName](splitter, function (m, i, e) {
matches.push({ value: m, index: i });
return getSubst(m);
});
// Finds split substrings
var lastIndex = 0;
for (var i = 0; i < matches.length; i++) {
var m = matches[i];
var nextIndex = ahead == true ? m.index : m.index + m.value.length;
if (nextIndex != lastIndex) {
var part = self.substring(lastIndex, nextIndex);
result.push(part);
lastIndex = nextIndex;
}
};
if (lastIndex < self.length) {
var part = self.substring(lastIndex, self.length);
result.push(part);
};
// Substitution of matched string
function getSubst(value) {
var substChar = value[0] == '0' ? '1' : '0';
var subst = '';
for (var i = 0; i < value.length; i++) {
subst += substChar;
}
return subst;
};
}
else {
result.add(self);
};
return result;
};
시험:
test('splitKeep', function () {
// String
deepEqual("1231451".splitKeep('1'), ["1", "231", "451"]);
deepEqual("123145".splitKeep('1', true), ["123", "145"]);
deepEqual("1231451".splitKeep('1', true), ["123", "145", "1"]);
deepEqual("hello man how are you!".splitKeep(' '), ["hello ", "man ", "how ", "are ", "you!"]);
deepEqual("hello man how are you!".splitKeep(' ', true), ["hello", " man", " how", " are", " you!"]);
// Regex
deepEqual("mhellommhellommmhello".splitKeep(/m+/g), ["m", "hellomm", "hellommm", "hello"]);
deepEqual("mhellommhellommmhello".splitKeep(/m+/g, true), ["mhello", "mmhello", "mmmhello"]);
});
나는 이것을 사용하고있다 :
String.prototype.splitBy = function (delimiter) {
var
delimiterPATTERN = '(' + delimiter + ')',
delimiterRE = new RegExp(delimiterPATTERN, 'g');
return this.split(delimiterRE).reduce((chunks, item) => {
if (item.match(delimiterRE)){
chunks.push(item)
} else {
chunks[chunks.length - 1] += item
};
return chunks
}, [])
}
를 엉망으로 만들면 안된다는 점을 제외하고는 다음과 String.prototype
같은 함수 버전이 있습니다.
var splitBy = function (text, delimiter) {
var
delimiterPATTERN = '(' + delimiter + ')',
delimiterRE = new RegExp(delimiterPATTERN, 'g');
return text.split(delimiterRE).reduce(function(chunks, item){
if (item.match(delimiterRE)){
chunks.push(item)
} else {
chunks[chunks.length - 1] += item
};
return chunks
}, [])
}
따라서 다음을 수행 할 수 있습니다.
var haystack = "aaaaaa<br />† bbbb<br />‡ cccc"
var needle = '<br \/>&#?[a-zA-Z0-9]+;';
var result = splitBy(haystack , needle)
console.log( JSON.stringify( result, null, 2) )
그리고 다음과 같이 끝납니다.
[
"<br />† bbbb",
"<br />‡ cccc"
]
jichi의 대답을 수정하여 여러 문자를 지원하는 기능에 넣었습니다.
String.prototype.splitAndKeep = function(separator, method='seperate'){
var str = this;
if(method == 'seperate'){
str = str.split(new RegExp(`(${separator})`, 'g'));
}else if(method == 'infront'){
str = str.split(new RegExp(`(?=${separator})`, 'g'));
}else if(method == 'behind'){
str = str.split(new RegExp(`(.*?${separator})`, 'g'));
str = str.filter(function(el){return el !== "";});
}
return str;
};
jichi의 답변 세 번째 방법은이 기능에서 작동하지 않으므로 네 번째 방법을 취하고 동일한 결과를 얻기 위해 빈 공간을 제거했습니다.
편집 : char1 또는 char2를 분할하는 배열을 제외한 두 번째 방법
String.prototype.splitAndKeep = function(separator, method='seperate'){
var str = this;
function splitAndKeep(str, separator, method='seperate'){
if(method == 'seperate'){
str = str.split(new RegExp(`(${separator})`, 'g'));
}else if(method == 'infront'){
str = str.split(new RegExp(`(?=${separator})`, 'g'));
}else if(method == 'behind'){
str = str.split(new RegExp(`(.*?${separator})`, 'g'));
str = str.filter(function(el){return el !== "";});
}
return str;
}
if(Array.isArray(separator)){
var parts = splitAndKeep(str, separator[0], method);
for(var i = 1; i < separator.length; i++){
var partsTemp = parts;
parts = [];
for(var p = 0; p < partsTemp.length; p++){
parts = parts.concat(splitAndKeep(partsTemp[p], separator[i], method));
}
}
return parts;
}else{
return splitAndKeep(str, separator, method);
}
};
용법:
str = "first1-second2-third3-last";
str.splitAndKeep(["1", "2", "3"]) == ["first", "1", "-second", "2", "-third", "3", "-last"];
str.splitAndKeep("-") == ["first1", "-", "second2", "-", "third3", "-", "last"];
'programing' 카테고리의 다른 글
Java switch 문 여러 경우 (0) | 2020.08.14 |
---|---|
ActiveRecord : 콘솔에서 테이블의 열 나열 (0) | 2020.08.14 |
Angular CLI 오류 : serve 명령을 Angular 프로젝트에서 실행해야하지만 프로젝트 정의를 찾을 수 없습니다. (0) | 2020.08.14 |
데이터 URL 파일 다운로드 (0) | 2020.08.14 |
Bash에서 파일을 바꾸는 효율적인 방법 (0) | 2020.08.14 |