эй, у меня сейчас проблемы, я хочу обнаружить строки в тексте с изображением.
{"a":"img1.jpg", "ab":"img2.jpg"}
мое текущее регулярное выражение:
/(a|ab)/g
Когда у меня есть текст вроде:
yeah abc
он заменяет "а" в "да" с img1.jpg, но также заменяет "ab"c на "img1.jpg".
Я могу избежать этого путем переключения /(ab|a)/, но это не может быть решением, так как у меня есть огромный несортированный список json в виде выражений (a, ab просто для простоты). Причина, по которой я делаю это, заключается в том, чтобы заменить собственные смайлики изображениями.
Как я могу сказать, что он заменяет только a, если за ним не следует b?
Или, если в строках нет пробелов и все они буквенно-цифровые, и вы хотите сопоставить их как целые слова, используйте /\b(a|ab)\b/
что, если у меня есть больше, чем просто a,ab? как /(a|ab|ac|b|bc|)/. Мне как-то нужно обеспечить его уникальность @WiktorStribiżew
/\b(a|ab|ac|b|bc)\b/ будет достаточно уникальным.
@WiktorStribiżew, к сожалению, это не сработало, когда у меня были настоящие смайлики, такие как: /\b(?|?❤️??)\b/ . они не узнаются в тексте...
Они не будут распознаны, поскольку смайлики — это не буквы. Я бы никогда не стал предлагать границы слов, если бы вы сказали, что работаете с эмодзи.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Отсортируйте клавиши эмодзи в порядке убывания, а затем создайте шаблон регулярного выражения следующим образом:
function replaceEmojis (str) {
const emojis = {
a: { src: 'imgA.jpg', color: 'red' },
abc: { src: 'imgABC.jpg', color: 'green' },
ab: { src: 'imgAB.jpg', color: 'blue' },
bc: { src: 'imgBC.jpg', color: 'orange' }
};
const fnDescendingOrder = ([x, y]) => x > y ? -1 : +(x != y);
const keys = Object.keys(emojis).sort((x, y) =>
fnDescendingOrder(x.length == y.length ? [x, y] : [x.length, y.length])
);
const pattern = new RegExp(keys.join('|'), 'g');
const transformed = str.replace(pattern, m => {
const emoji = emojis[m];
return '<img class = "' + emoji.color + '" src = "' + emoji.src + '">';
});
return transformed;
};
let str = 'yeah abc ab a abca bcaba';
result.innerHTML = replaceEmojis(str);img { width: 10px; height: 100%; }
img.red { background: red; }
img.green { background: green; }
img.blue { background: blue; }
img.orange { background: orange; }<div id = "result"></div>Вы должны отсортировать в порядке убывания сначала по длине, затем по алфавиту. Причина bc должна быть проверена после abc.
Я пытаюсь отсортировать его по атрибуту, а не по ключу, потому что у меня есть для него атрибут. Как я могу отсортировать объект объектов на основе свойства объектов? Например, сортировка по возрасту объекта: const arr = { a: { name: "Robin Van Persie", age: 28 }, b: { name: "Theo Walcott", age: 22 }, c: { name: "Bacary Sagna", age: 26 } }.sort(function(obj1, obj2) { return obj2.age - obj1.age; });
@Андре. Функция sort взята из Array.prototype, для ее вызова вам нужно находиться в экземпляре массива. Сделайте это так: arr = Object.values(obj);, затем arr.sort((x, y) => x.age - y.age);
Просто сначала отсортируйте список, чтобы более длинные варианты были первыми.