Fabio Di Stasio
Fabio Di Stasio

Reputation: 38

A RegEx to split by semicolon outside single or double quotes

I need a JavaScript RegEx to split a string by semicolon outside single or double quotes.

Actually i'm using the following regex /(?!\B['"][^'"]*);(?![^'"]*['"]\B)/gm that sadly doesn't cover every case.

What i need:

const string = `Lorem ipsum; "dolor sit; amet"; consectetur 'adipiscing; elit.' Fusce; sit amet ligula.; Phasellus in laoreet quam.`;

const resultArr = string.split(/THEREGEX/gm);

console.log(resultArr);
// ["Lorem ipsum", "\"dolor sit; amet\"", " consectetur 'adipiscing; elit.' Fusce", "sit amet ligula.", " Phasellus in laoreet quam."]

Upvotes: 2

Views: 774

Answers (1)

anubhava
anubhava

Reputation: 785098

You may use this regex:

((?:[^;'"]*(?:"(?:\\.|[^"])*"|'(?:\\.|[^'])*')[^;'"]*)+)|;

RegEx Demo

Code:

const s = `Lorem ipsum; "dolor sit; amet"; consectetur 'adipiscing; elit.' Fusce; sit amet ligula.; Phasellus in laoreet quam.`
const re = /((?:[^;'"]*(?:"(?:\\.|[^"])*"|'(?:\\.|[^'])*')[^;'"]*)+)|;/

console.log( s.split(re).filter(Boolean) )

RegEx Details:

  • (: Start capture group #1
    • [^;'"]*: Match 0 or more any character that are not ' and " and not ;
    • (?:: Start non-capture group
      • "(?:\\.|[^"])*": Match a double quoted substring ignoring all escaped quotes
      • |: OR
      • '(?:\\.|[^'])*': Match a single quoted substring ignoring all escaped quotes
    • ): End non-capture group
    • [^;'"]*: Match 0 or more any character that are not ' and " and not ;
  • ): End capture group #1
  • |: OR
  • ;: Match a ;
  • .filter(Boolean): is used to remove empty results from split array

Upvotes: 6

Related Questions