23

I would like to get the text between double quotes using JavaScript. I found online something like title.match(/".*?"/); but the thing is that sometimes I have text between double quotes but sometimes there are no quotes. What I am saying is that sometimes I receive strings like: Neque porro quisquam est qui dolorem ipsum and sometimes strings like: Neque "porro quisquam est" qui dolorem ipsum. The thing is, when I have text containing double quotes I want to retrieve the text between them but when they aren't present, I'd like the whole text. Also I have observered that string.indexOf("\"") does not work and I don't really know how to approach this problem. Thanks.

Teo
  • 3,394
  • 11
  • 43
  • 73

4 Answers4

44

Try:

<script>
let str1 = 'Neque porro quisquam est qui dolorem ipsum';
let str2 = 'Neque "porro quisquam est" qui dolorem ipsum';
let str3 = 'Neque "porro';
let str4 = 'Neque "porro" quisquam "est" qui dolorem ipsum';

function extractFirstText(str){
  const matches = str.match(/"(.*?)"/);
  return console.log(matches
    ? matches[1]
    : str);
}


function extractAllText(str){
  const re = /"(.*?)"/g;
  const result = [];
  let current;
  while (current = re.exec(str)) {
    result.push(current.pop());
  }
  return console.log(result.length > 0
    ? result
    : [str]);
}

// Execution of the functions

extractFirstText(str1);
//Neque porro quisquam est qui dolorem ipsum

extractFirstText(str2);
//porro quisquam est

extractFirstText(str3);
//Neque "porro

extractFirstText(str4);
//porro

extractAllText(str1);
//Array [ "Neque porro quisquam est qui dolorem ipsum" ]

extractAllText(str2);
//Array [ "porro quisquam est" ]

extractAllText(str3);
//Array [ "Neque \"porro" ]

extractAllText(str4);
//Array [ "porro", "est" ]
</script>

EDIT reworked to take into account both @AshishMaity comment in a discarded edit about matching more than one substring, and @JosephCho comment about the original breaking in case there is a single quote (str3 in the case above)

Staxlinou
  • 1,351
  • 1
  • 5
  • 20
gotofritz
  • 3,341
  • 1
  • 31
  • 47
19

try it with this one:

/"((?:\\.|[^"\\])*)"/

Regular expression visualization

Debuggex Demo

bukart
  • 4,906
  • 2
  • 21
  • 40
10

In a single regex:

var m = s.match(/(?:"[^"]*"|^[^"]*$)/)[0].replace(/"/g, "");

TEST:

s = 'Neque "porro quisquam est" qui dolorem ipsum';
m = s.match(/(?:"[^"]*"|^[^"]*$)/)[0].replace(/"/g, "");
//=> porro quisquam est

s = 'Neque porro quisquam est qui dolorem ipsum';
m = s.match(/(?:"[^"]*"|^[^"]*$)/)[0].replace(/"/g, "");
//=> Neque porro quisquam est qui dolorem ipsum
anubhava
  • 761,203
  • 64
  • 569
  • 643
3

split() function can be used get value in double quote

let str1 = 'Neque "porro quisquam est" qui dolorem ipsum';
let str2 = 'Neque porro quisquam est qui dolorem ipsum';

function findFirstOccurance(str){
  const matches = str.split('"');
  return matches[1] ? matches[1] : str;
}


console.log(findFirstOccurance(str1));
console.log(findFirstOccurance(str2)); 
Manasi
  • 765
  • 6
  • 17