У меня есть функция, которая находит и заменяет из массива значений Find Replace.
Как настроено, он заменяет частичные варды
Мне нужно заменить только слово whole.
Как заменить только целые слова?
function test_n() {
let arr= [
[ 'Collins, Matthew James'],
[ 'Collins, Matthew'],
[ 'Collins, Matthew J'],
[ 'Collins, M. J.'],
[ 'Collins, M.J.'],
[ 'Collins, M.'],
[ 'Collins, M.J'],
[ 'Collins, M'],
[ 'Collins, M J']
]
let RgX = [
[ 'Collins, Matthew James', 'Collins, Matthew' ],
[ 'Collins, Matthew', 'Collins, Matthew' ],
[ 'Collins, Matthew J', 'Collins, Matthew' ],
[ 'Collins, M. J.', 'Collins, Matthew' ],
[ 'Collins, M.J.', 'Collins, Matthew' ],
[ 'Collins, M.', 'Collins, Matthew' ],
[ 'Collins, M.J', 'Collins, Matthew' ],
[ 'Collins, M', 'Collins, Matthew' ],
[ 'Collins, M J', 'Collins, Matthew' ]
]
//RgX[0] =to_replace value
//RgX[1] = replace_with value
arr = processValues(arr, RgX)
console.info(arr)
}
function processValues(values, replaceTable) {
//let replaceTable = RgX;
return values.map(row =>
row.map(c => c
? replaceTable.reduce(
(curString, tableEntry) => curString.replaceAll(...tableEntry)
, c) : '', ""));
}
Я получаю результат
[ [ 'Collins, Matthewatthew' ],
[ 'Collins, Matthewatthew' ],
[ 'Collins, Matthewatthew' ],
[ 'Collins, Matthewatthew' ],
[ 'Collins, Matthewatthew' ],
[ 'Collins, Matthewatthew' ],
[ 'Collins, MatthewatthewJ' ],
[ 'Collins, Matthew' ],
[ 'Collins, Matthew J' ] ]
Мне нужно
[ [ 'Collins, Matthew' ],
[ 'Collins, Matthew' ],
[ 'Collins, Matthew' ],
[ 'Collins, Matthew' ],
[ 'Collins, Matthew' ],
[ 'Collins, Matthew' ],
[ 'Collins, Matthew' ],
[ 'Collins, Matthew' ],
[ 'Collins, Matthew' ] ]
Я попытался изменить это.
(curString, tableEntry) => curString.replaceAll(...tableEntry) к (curString, tableEntry) => curString.replaceAll(new RegExp('\\b' + tableEntry[0] + '//b','g'),tableEntry[1])
Но эта замена не влияет на вывод; выход = вход
Я думал, что textFinder работает только с диапазонами, а не с массивами
Вы хотели '\\b', а не '//b'.
Почему бы не написать один паттерн .*\bCollins, (?:Matthew(?: James)?\b|M\.?(?: ?J\.?)?)(?!\S).* и заменить на Collins, Matthew regex101.com/r/fZ5bt9/1
Поэтому я исправил неверный '//b', но это все еще не работает для всех записей, которые заканчиваются на . Пример: 'Collins, Matthew J. он возвращает 'Collins, Matthew J'
Четвертая птица, Мэтью, — это всего лишь один вариант имени из многих, поэтому мне нужно общее решение.
Замените функцию processValues на:
function processValues(values, replaceTable) {
return values.map(name => replaceTable.find(
fromTo => fromTo[0] == name
)).map(fromTo => fromTo ? fromTo[1] : undefined);
}
Примечания:
.find()
находит имя в таблице и возвращает массив fromTo
.map()
изменяет массив fromTo
на значение "to"
Возможно, вам будет проще пользоваться textFinder