У меня есть функция, которая находит и заменяет из массива значений 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