Заменить все точки без особых правил

У меня есть строка:

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 не заменять, другие необходимо заменить

«но без 5.1» - не совсем четкое правило. Что с 2.2 и 6.7, должны они совпадать или нет?

Andrey Tyukin 18.05.2018 19:12

Без дополнительных правил это было бы невозможно. что, если в вашем файле будет 2015.1080p. Это 5.1, которую надо поменять ...

William_Wilson 18.05.2018 19:14

Пожалуйста, покажите свои попытки.

revo 18.05.2018 19:15

@AndreyTyukin мой означает, что правило таково: d{1} . d{1} не заменять, но цифровой перед точкой больше одной или после точки больше одной нужно заменять.

taobataoma 18.05.2018 19:29

@William_Wilson, когда 2005.1080p точка должна быть пробелом, только d {1} .d {1} не заменять

taobataoma 18.05.2018 19:36

@revo, образец Resident.Evil.The.Final.Chapter.2016.BluRay.1080p.AVC.DTS-HD‌​.MA7.1-LKReborn-CHDB‌​its. Я хочу заменить все точки на пробелы без 7.1 в этой строке. Хочу получить результат Resident Evil The Final Chapter 2016 BluRay 1080p AVC DTS-HD MA7.1-LKReborn-CHDBits

taobataoma 18.05.2018 19:37

Вы пробовали что-нибудь? Кстати, ниже ответ имеет решение.

revo 18.05.2018 19:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
7
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать этот 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-CHDB‌​its, но он заменяет все точки, включает точку в 7.1, как сохранить точку в 7.1?

taobataoma 18.05.2018 19:48

Большое спасибо. Это близко к совершенству, только небольшой вопрос, если ввод - Resident.Evil.The.Final.Chapter.2016.BluRay.1080p.AVC.DTS-HD‌​.MA.7.1-LKReborn-CHD‌​Bits, обычно, может быть, пробел или точка перед 7.1, как это изменить?

taobataoma 18.05.2018 19:58

Если у вас более новые браузеры, вы можете использовать: /((?<=^|\D)\d\.\d(?=\D|$))|\./g

anubhava 18.05.2018 20:05

привет, у меня возникла ошибка eslint: Ошибка синтаксического анализа: Ошибка синтаксического анализа регулярного выражения: Недействительное регулярное выражение: /((?<=^|\D)\d\.\d(?=\D|$))|\./ : Неверная группа, как ее редактировать? Благодарю. работает нормально, только ошибка ворса.

taobataoma 18.05.2018 20:15

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 не в порядке.

taobataoma 18.05.2018 20:27

Вы можете видеть в демонстрации выше, она возвращает MA 5.2-LKReborn в конце

anubhava 18.05.2018 20:38

да, вы правы, похоже, что ответ на @ Четвертая птичка немного попроще

taobataoma 18.05.2018 20:42

Если ввод - '2012.2008.abc MA.5.2LKReborn', то это регулярное выражение сделает его "2012 2008 abc MA 5 2LKReborn" вместо "2012 2008 abc MA 5.2LKReborn".

anubhava 18.05.2018 20:48
Ответ принят как подходящий

Вы можете сопоставить 5.1 или 7.1 и захватить другие точки в захваченной группе 1:

[57]\.1\b|(\.)

При использовании заменять вы можете проверить, совпадает ли подматч с точкой.

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 18.05.2018 20:28

@taobataoma Это несколько более широкое совпадение, но для ваших данных примера оно работает. [0-9]\.[0-9]\b|(\.) Это может, например, также соответствовать 9.9.

The fourth bird 18.05.2018 20:31

это не проблема, я принимаю этот результат. в некоторых особенностях я могу изменить этот шаблон.

taobataoma 18.05.2018 20:35

Другие вопросы по теме