должен иметь разделенные запятые строки текста, где каждый текст имеет или нет - запятую - маркер в списке, какКак сопоставить текст с маркером выражением с/без отрицательного предпросмотра в JavaScript Regex
var tokens=['Inc.','Ltd','LLC'];
так струна как
var companies="Apple, Inc., Microsoft, Inc., Buzzfeed, Treasure, LLC";
Я хочу, чтобы получить этот массив в качестве выходного
var companiesList = [
"Apple Inc.",
"Microsoft Inc.",
"Buzzfeed",
"Treasure LLC"
];
Так что, во-первых сделал RegExp
как тот
var regex=new RegExp("([a-zA-Z&/? ]*),\\s+("+token+")", "gi")
, что я получаю спички и искать регулярное выражение, как
var regex=new RegExp("([a-zA-Z&/? ]*),\\s+("+item+")", "i")
для каждой из лексем:
tokens.forEach((item) => {
var regex = new RegExp("([a-zA-Z&/? ]*),\\s+(" + item + ")", "gi")
var matches = companies.match(regex) || []
console.log(item, regex.toString(), matches)
matches.forEach((m) => {
var regex = new RegExp("([a-zA-Z&/? ]*),\\s+(" + item + ")", "i")
var match = m.match(regex)
if (match && match.length > 2) {
var n = match[1].trim();
var c = match[2].trim();
companiesList.push(n + ' ' + c);
}
});
});
Таким образом, Я могу захватить маркеры и согласованные группы 1 и 2.
var tokens = ['inc.', 'ltd', 'llc'],
companies = "Apple, Inc., Microsoft, Inc., Buzzfeed, Treasure, LLC",
companiesList = [];
tokens.forEach((item) => {
var regex = new RegExp("([a-zA-Z&/? ]*),\\s+(" + item + ")", "gi")
var matches = companies.match(regex) || []
console.log(item, regex.toString(), matches)
matches.forEach((m) => {
var regex = new RegExp("([a-zA-Z&/? ]*),\\s+(" + item + ")", "i")
var match = m.match(regex)
if (match && match.length > 2) {
var n = match[1].trim();
var c = match[2].trim();
companiesList.push(n + ' ' + c);
}
});
});
console.log(companiesList)
Проблема заключается в том, что я пропускаю через запятую текста без маркеров после запятой, как: Buzzfeed
.
Идея заключается в том, чтобы использовать не захват группу в отрицательном взгляде вперед (см here об инородцах захватывающих групп в матче регулярного выражения)
/([a-zA-Z]*)^(?:(?!ltd).)+$/gi
Но в этом случае у меня есть любое совпадение, когда во входной струне маркер присутствует:
"Apple, Inc., Microsoft, Inc., Buzzfeed, Treasure LLC".match(/([a-zA-Z]*)^(?:(?!llc).)+$/gi)
в то время как я хочу, чтобы соответствовать только текст, которые не имеют его, так что я хотел бы получить - как противоположность раньше:
["Buzzfeed"]
Так как свести на нет/изменить предыдущий код для работы в обоих случаях, чтобы получить в конце наборной массив:
var companiesList = [
"Apple Inc.",
"Microsoft Inc.",
"Buzzfeed",
"Treasure LLC"
];
Вы поняли ответ на популярном SO вопрос о соответствии строки, не содержащую ни слова. Вам нужно '(?! Ltd | и т. Д.)' Lookahead, где вы можете добавлять альтернативы после трубы. –
@ WiktorStribiżew uhm это возможно, но проверьте код и попробуйте с тем, что у меня есть некоторые шаблоны для уважения, такие как 'Name, Inc.'. Поэтому мне нужно сопоставить этот шаблон и последний (без). – loretoparisi
Чтобы просто соответствовать Buzzfeed, вам нужно исключить соответствующие «LLC» и т. Д., А также все слова, которые следуют за ними. [Это] (https://jsfiddle.net/wav6gaob/) не выглядит красиво. Возможно, adaneo предлагает лучший выход. –