У меня есть строка:
2012.2008.The.Victorias.Secret.Fashion.Show.2016.720p.HDTV.x264-HD.MA.5.1 21d.BATV <6>-20
Я хочу заменить всю точку на пробел, но без "5.1", как я могу написать строку регулярного выражения?
5.1 может быть 6.1, 7.12.1, одно число перед точкой и одно число после точки, а 234.123 необходимо заменить точкой на пробел.
Я привожу строку ниже:
Cast.Away.2000.1080p.Blu-ray.AVC.DTS-HD.MA.5.1-XOXO-HDSky5.1 не заменять, другие необходимо заменить
Resident.Evil.The.Final.Chapter.2016.BluRay.1080p.AVC.DTS-HD.MA7.1-LKReborn-CHDBits7.1 не заменять, другие необходимо заменить
Без дополнительных правил это было бы невозможно. что, если в вашем файле будет 2015.1080p. Это 5.1, которую надо поменять ...
Пожалуйста, покажите свои попытки.
@AndreyTyukin мой означает, что правило таково: d{1} . d{1} не заменять, но цифровой перед точкой больше одной или после точки больше одной нужно заменять.
@William_Wilson, когда 2005.1080p точка должна быть пробелом, только d {1} .d {1} не заменять
@revo, образец Resident.Evil.The.Final.Chapter.2016.BluRay.1080p.AVC.DTS-HD.MA7.1-LKReborn-CHDBits. Я хочу заменить все точки на пробелы без 7.1 в этой строке. Хочу получить результат Resident Evil The Final Chapter 2016 BluRay 1080p AVC DTS-HD MA7.1-LKReborn-CHDBits
Вы пробовали что-нибудь? Кстати, ниже ответ имеет решение.



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


Вы можете использовать этот string.replace с функцией обратного вызова:
let str = '2012.2008.Resident6.1.Evil 4.3.The 7.8 .Final.Chapter.2016.BluRay.1080p.AVC.DTS-HD.MA.5.2-LKReborn, get the result 2012 2008 Resident6.1 Evil 4.3 The 7.8 Final Chapter 2016 BluRay 1080p AVC DTS-HD MA.5.2-LKReborn';
var re = /((?:^|\D)\d\.\d(?=\D|$))|\./g;
var repl = str.replace(re, function($0, $1) {
return ($1 ? $1.replace(/^\./, ' ') : ' ');
});
console.info(repl);Здесь регулярное выражение /((?:^|\D)\d\.\d(?=\D|$))|\./ соответствует и захватывает digit.digit в захваченной группе # 1. В функции обратного вызова мы проверяем наличие $1 (захваченная группа №1), чтобы понять, заменять ли совпадение пробелом или $1 (с заменой начальной точки пробелом).
Большое спасибо, я тестирую ваш код и ввожу для Resident.Evil.The.Final.Chapter.2016.BluRay.1080p.AVC.DTS-HD.MA7.1-LKReborn-CHDBits, но он заменяет все точки, включает точку в 7.1, как сохранить точку в 7.1?
Большое спасибо. Это близко к совершенству, только небольшой вопрос, если ввод - Resident.Evil.The.Final.Chapter.2016.BluRay.1080p.AVC.DTS-HD.MA.7.1-LKReborn-CHDBits, обычно, может быть, пробел или точка перед 7.1, как это изменить?
Если у вас более новые браузеры, вы можете использовать: /((?<=^|\D)\d\.\d(?=\D|$))|\./g
привет, у меня возникла ошибка eslint: Ошибка синтаксического анализа: Ошибка синтаксического анализа регулярного выражения: Недействительное регулярное выражение: /((?<=^|\D)\d\.\d(?=\D|$))|\./ : Неверная группа, как ее редактировать? Благодарю. работает нормально, только ошибка ворса.
en, теперь я пишу строку языка, чтобы проверить ее 2012.2008.Resident6.1.Evil 4.3.The 7.8 .Final.Chapter.2016.BluRay.1080p.AVC.DTS-HD.MA.5.2-LKReborn, получить результат 2012 2008 Resident6.1 Evil 4.3 The 7.8 Final Chapter 2016 BluRay 1080p AVC DTS-HD MA.5.2-LKReborn, последний .5.2 не в порядке.
Вы можете видеть в демонстрации выше, она возвращает MA 5.2-LKReborn в конце
да, вы правы, похоже, что ответ на @ Четвертая птичка немного попроще
Если ввод - '2012.2008.abc MA.5.2LKReborn', то это регулярное выражение сделает его "2012 2008 abc MA 5 2LKReborn" вместо "2012 2008 abc MA 5.2LKReborn".
Вы можете сопоставить 5.1 или 7.1 и захватить другие точки в захваченной группе 1:
При использовании заменять вы можете проверить, совпадает ли подматч с точкой.
const strings = [
"Resident.Evil.The.Final.Chapter.2016.BluRay.1080p.AVC.DTS-HD.MA7.1-LKReborn-CHDBits",
"2012.2008.The.Victorias.Secret.Fashion.Show.2016.720p.HDTV.x264-HD.MA.5.1 21d.BATV <6>-20",
"Cast.Away.2000.1080p.Blu-ray.AVC.DTS-HD.MA.5.1-XOXO-HDSky"
];
let pattern = /[57]\.1\b|(\.)/g;
strings.forEach((str) => {
console.info(str.replace(pattern, function(match, p1) {
return p1 === "." ? " " : match;
}));
});Спасибо, я меняю выкройку на /[0-9]\.[0-9]\b|(\.)/g, все в порядке, правда?
@taobataoma Это несколько более широкое совпадение, но для ваших данных примера оно работает. [0-9]\.[0-9]\b|(\.) Это может, например, также соответствовать 9.9.
это не проблема, я принимаю этот результат. в некоторых особенностях я могу изменить этот шаблон.
«но без 5.1» - не совсем четкое правило. Что с
2.2и6.7, должны они совпадать или нет?