简体   繁体   中英

Regex to fetch all spaces as long as they are not enclosed in brackets

Regex to fetch all spaces as long as they are not enclosed in braces

This is for a javascript mention system

ex: "Speak @::{Joseph Empyre}{b0268efc-0002-485b-b3b0-174fad6b87fc}, all right?"

Need to get:

[ "Speak ", "@::{Joseph Empyre}{b0268efc-0002-485b-b3b0-174fad6b87fc}", ",", "all ", "right?" ]

[Edit]

Solved in: https://codesandbox.io/s/rough-http-8sgk2

Sorry for my bad english

I interpreted your question as you said to to fetch all spaces as long as they are not enclosed in braces , although your result example isn't what I would expect. Your example result contains a space after speak, as well as a separate match for the , after the {} groups. My output below shows what I would expect for what I think you are asking for, a list of strings split on just the spaces outside of braces.

const str =
    "Speak @::{Joseph Empyre}{b0268efc-0002-485b-b3b0-174fad6b87fc}, all right?";

// This regex matches both pairs of {} with things inside and spaces
// It will not properly handle nested {{}}
// It does this such that instead of capturing the spaces inside the {},
// it instead captures the whole of the {} group, spaces and all,
// so we can discard those later
var re = /(?:\{[^}]*?\})|( )/g;
var match;
var matches = [];
while ((match = re.exec(str)) != null) {
  matches.push(match);
}

var cutString = str;
var splitPieces = [];
for (var len=matches.length, i=len - 1; i>=0; i--) {
  match = matches[i];
  // Since we have matched both groups of {} and spaces, ignore the {} matches
  // just look at the matches that are exactly a space
  if(match[0] == ' ') {
    // Note that if there is a trailing space at the end of the string,
    // we will still treat it as delimiter and give an empty string
    // after it as a split element
    // If this is undesirable, check if match.index + 1 >= cutString.length first
    splitPieces.unshift(cutString.slice(match.index + 1));
    cutString = cutString.slice(0, match.index);
  }
}
splitPieces.unshift(cutString);
console.log(splitPieces)

Console:

["Speak", "@::{Joseph Empyre}{b0268efc-0002-485b-b3b0-174fad6b87fc},", "all", "right?"]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM