将字符串拆分为 javascript 中的匹配组和非匹配组
Splitting string into matching and non-matching groups in javascript
我正在尝试将字符串拆分为一个字符串数组,这些字符串与正则表达式匹配,而那些不匹配:
string = "Lazy {{some_animal}} jumps over.."
# do some magic with regex /({{\s?[\w]+\s?}})/g and its negation
array = ["Lazy ", "{{some_animal}}", " jumps over.."]
在 javascript?
中执行此操作的最佳性能方式
我相当确定一个简单的 exec
循环将是您的最佳选择:
function getSegments(rex, str) {
var segments = [];
var lastIndex = 0;
var match;
rex.lastIndex = 0; // In case there's a dangling previous search
while (match = rex.exec(str)) {
if (match.index > lastIndex) {
segments.push(str.substring(lastIndex, match.index));
}
segments.push(match[0]);
lastIndex = match.index + match[0].length;
}
if (lastIndex < str.length) {
segments.push(str.substring(lastIndex));
}
return segments;
}
var rex = /{{\s?[\w]+\s?}}/g;
var string = "Lazy {{some_animal}} jumps over..";
console.log(getSegments(/{{\s?[\w]+\s?}}/g, string));
注意我删除了捕获组;这种解决方案不需要它。
你可以使用 String match
下面的正则表达式只匹配任何不是胡须的东西,可选地被胡须包围。
示例片段:
var str = "Lazy {{some_animal}} jumps over..";
const pattern = /\{*[^{}]+\}*/g;
var array = str.match(pattern);
console.log(str);
console.log(pattern);
console.log(array);
但为了更精确,正则表达式模式变得有点复杂。
下面的正则表达式匹配:
- "what you want"
(每边2个胡须之间的一个字)
- 或"what you don't want followed by what you want"
(使用惰性匹配和积极的前瞻)
- 或"what remains"
var str = "Lazy {{some_animal}} jumps over..";
const pattern = /\{\{\w+\}\}|.+?(?=\{\{\w+\}\})|.+/g;
var array = str.match(pattern);
console.log(str);
console.log(pattern);
console.log(array);
最后但同样重要的是,邪恶的 SM 方法。
在同一个正则表达式上拆分和匹配。并将它们连接成一个数组。
这种方法的缺点是不保留顺序。
var str = "Lazy {{some_animal}} jumps over..";
const pattern = /\{\{\w+\}\}/g;
var what_you_want = str.match(pattern);
var what_you_dont_want = str.split(pattern);
var array = what_you_want.concat(what_you_dont_want);
console.log(str);
console.log(pattern);
console.log(array);
我正在尝试将字符串拆分为一个字符串数组,这些字符串与正则表达式匹配,而那些不匹配:
string = "Lazy {{some_animal}} jumps over.."
# do some magic with regex /({{\s?[\w]+\s?}})/g and its negation
array = ["Lazy ", "{{some_animal}}", " jumps over.."]
在 javascript?
中执行此操作的最佳性能方式我相当确定一个简单的 exec
循环将是您的最佳选择:
function getSegments(rex, str) {
var segments = [];
var lastIndex = 0;
var match;
rex.lastIndex = 0; // In case there's a dangling previous search
while (match = rex.exec(str)) {
if (match.index > lastIndex) {
segments.push(str.substring(lastIndex, match.index));
}
segments.push(match[0]);
lastIndex = match.index + match[0].length;
}
if (lastIndex < str.length) {
segments.push(str.substring(lastIndex));
}
return segments;
}
var rex = /{{\s?[\w]+\s?}}/g;
var string = "Lazy {{some_animal}} jumps over..";
console.log(getSegments(/{{\s?[\w]+\s?}}/g, string));
注意我删除了捕获组;这种解决方案不需要它。
你可以使用 String match
下面的正则表达式只匹配任何不是胡须的东西,可选地被胡须包围。
示例片段:
var str = "Lazy {{some_animal}} jumps over..";
const pattern = /\{*[^{}]+\}*/g;
var array = str.match(pattern);
console.log(str);
console.log(pattern);
console.log(array);
但为了更精确,正则表达式模式变得有点复杂。
下面的正则表达式匹配:
- "what you want"
(每边2个胡须之间的一个字) - 或"what you don't want followed by what you want"
(使用惰性匹配和积极的前瞻) - 或"what remains"
var str = "Lazy {{some_animal}} jumps over..";
const pattern = /\{\{\w+\}\}|.+?(?=\{\{\w+\}\})|.+/g;
var array = str.match(pattern);
console.log(str);
console.log(pattern);
console.log(array);
最后但同样重要的是,邪恶的 SM 方法。
在同一个正则表达式上拆分和匹配。并将它们连接成一个数组。
这种方法的缺点是不保留顺序。
var str = "Lazy {{some_animal}} jumps over..";
const pattern = /\{\{\w+\}\}/g;
var what_you_want = str.match(pattern);
var what_you_dont_want = str.split(pattern);
var array = what_you_want.concat(what_you_dont_want);
console.log(str);
console.log(pattern);
console.log(array);