Xeul
Xeul

Reputation: 15

Regex get all quoted words that are not also single quoted

Would it be possible to get all quoted text with a single regex?

Example text from regexr:

Edit the "Expression" & Text to see matches. Roll over "matches" or the expression for details. Undo mistakes with ctrl-z. Save 'Favorites & "Share" expressions' with friends or the Community. "Explore" your results with Tools. A full Reference & Help is available in the Library, or watch the video Tutorial.

In this case I would like to capture Expression, matches and Explore but not Share since 'Favorites & "Share" expressions' is single quoted.

Upvotes: 1

Views: 81

Answers (2)

Casimir et Hippolyte
Casimir et Hippolyte

Reputation: 89557

You can't build a regex that matches only the parts you want in Javascript, however you can build a pattern that matches all the string without gaps and use a capture group to extract the part you want:

/[^"']*(?:'[^']*'[^"']*)*"([^"]*)"/g
#^----------------------^ all that isn't content between double quotes

Since your string may end with something like abcd 'efgh "ijkl" mnop' qrst (in short without the part you want but with a double quote part inside single quote substring), It's more secure to change the pattern to:

/[^"']*(?:'[^']*(?:'[^"']*|$))*(?:"([^"]*)"|$)/g

and to discard the last match.

Upvotes: 2

MohaMad
MohaMad

Reputation: 2855

Without special regex pattern:

var mystr = "Edit the \"Expression\" & Text to see matches. Roll over \"matches\" or the expression for details. Undo mistakes with ctrl-z. Save 'Favorites & \"Share\" expressions' with friends or the Community. \"Explore\" your results with Tools. A full Reference & Help is available in the Library, or watch the video Tutorial."
var myarr = mystr.split(/\"/g)
var opening=false;
for(var i=1; i<myarr.length;i=i+2){
    if((myarr[i-1].length-myarr[i-1].replace(/'/g,"").length)%2===1){opening=!opening;}
    if(!opening){console.log(myarr[1]);}
}

How works:

  • split text by "

  • odd index is string with " wrapper

  • if before this index, odd numbers of ' exists, this item wrapped by ' and should not be considered

Upvotes: 0

Related Questions