Как написать регулярное выражение для получения текста, который не в двойных кавычках? - PullRequest
2 голосов
/ 05 мая 2019

У меня есть следующий текст и шаблон.

var str = 'Give 13234 "100" "1.2.3.4"  %!'; 
var patt1 = /"(.*?)"/gm;
var result = str.match(patt1);

Результат дает мне текст в двойных кавычках: "100","1.2.3.4"

Есть ли запрос, который даст мне текст, которыйне в двойных кавычках?

Ожидаемый результат: Give 13234 %!

Ответы [ 4 ]

0 голосов
/ 05 мая 2019

Вот регулярное выражение:

/".*?"|([^"]*)/g в группе 1 мы ищем элементы.Примите во внимание, что это регулярное выражение предоставит изолированный spaces

const regex = /".*?"|([^"]*)/g;
const str = `Give 13234 "100" "1.2.3.4" %!`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        groupIndex === 1 && match && console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}
0 голосов
/ 05 мая 2019

Определенно, не рекомендуется писать регулярные выражения типа (.*?), потому что вы соответствуете чему-либо.

Я думаю, что этот пример более чистый:

var str = 'Give 13234 "100" "1.2.3.4"  %!'; 
str.replace(/\s?"(.*?)"\s?/g,'');

и для текущегоВ этом случае я бы изменил регулярное выражение на:

/\s?"(\d+\.?){1,4}"\s?/g

optional match space
(match one or more digits and optional match dot){match the right side from 1 to 4 times}
optional match space

0 голосов
/ 05 мая 2019

Решением без регулярных выражений является split строка в " и поиск четных элементов.

var tests = [
  'Give 13234 "100" "1.2.3.4"  %!',
  '"foobar" match',
  'match "foobar"'
];
tests.forEach(function(str) {
  var result = str.split('"').filter(function(_, i) {
    return i % 2 === 0;
  });
  console.log(str + " -> " + result.join(""));
});
0 голосов
/ 05 мая 2019

Вместо использования не жадного квантификатора .*? вы можете использовать отрицательный класс символов "[^"]*" *, чтобы сопоставить двойные кавычки, за которыми следуют 0+ пробелов, и заменить их пустой строкой.

Если вы не хотите совпадать с новой строкой, вы можете добавить к классу символов "[^\n"]*"

var str = 'Give 13234 "100" "1.2.3.4" %!';
var patt1 = /"[^"]*" */gm;
var result = str.replace(patt1, "");
console.log(result);
...