I am trying to split the string into an array of strings those matching a regular expression and those that don't:
string = "Lazy {{some_animal}} jumps over.."
# do some magic with regex /({{\s?[\w]+\s?}})/g and its negation
array = ["Lazy ", "{{some_animal}}", " jumps over.."]
Best performant way to do that in javascript?
You can use String match for that
The regex below simply matches anything that's not a mustach, optionally surrounded by mustaches.
Example snippet:
var str = "Lazy {{some_animal}} jumps over..";
const pattern = /\{*[^{}]+\}*/g;
var array = str.match(pattern);
console.log(str);
console.log(pattern);
console.log(array);
But to make it more precise, the regex pattern becomes a bit more complicated.
The regex below matches:
- "what you want"
(a word between 2 mustaches on each side) - OR "what you don't want followed by what you want"
(using lazy matching and positive lookahead) - OR "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);
And last but not least, the evil SM method.
Split AND Match on the same regex. And concatinate them into a single array.
The downside of this method is that the order is not preserved.
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);
I'm fairly sure a simple exec
loop is going to be your best option:
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));
Note I removed the capture group; it's not needed for this sort of solution.
来源:https://stackoverflow.com/questions/45501997/splitting-string-into-matching-and-non-matching-groups-in-javascript