Как найти первый символ без смежных дубликатов в строке с регулярным выражением? - PullRequest
3 голосов
/ 25 апреля 2019

У меня есть жало, и мне нужно найти первый символ без смежных дубликатов.Интересно, как это сделать с помощью регулярных выражений.Вот что я должен был сделать.Например, для строки = aabbbcddg ответ - c.

const paragraph='aabbbcddg';
console.log(paragraph.match(/(.)\1{1}/));

или

const paragraph='aabbbcddg';
console.log(paragraph.match(/[.]{1}/));

Можете ли вы объяснить, почему мои решения не работают?

Ответы [ 2 ]

3 голосов
/ 25 апреля 2019

Ваш шаблон (.)\1{1} (вы можете опустить {1}) соответствует 2 последовательным символам в строке и не учитывает следующий символ.

Вы можете сопоставить соседние символы в начале строки ^, а затем повторить это 1+ раз. Затем захватите в группе 2 первый символ:

^(?:(.)\1+)+(.)
  • ^ Начало строки
  • (?: Группа без захвата
    • (.)\1+ Захватите любой символ, кроме новой строки в группе 1, и повторите обратную ссылку \1 1+ раз
  • )+ Закрыть группу без захвата и повторить 1+ раз (.) Соответствует любому символу, кроме новой строки в группе 2

Regex demo

Если вы хотите получить несколько совпадений и ваша строка не начинается с последовательных символов, вы можете опустить якорь ^:

Regex demo

const regex = /(?:(.)\1+)+(.)/;
const str = `aabbbcddg`;
console.log(str.match(regex)[2]);
1 голос
/ 25 апреля 2019

(.)\1{1} соответствует двум одинаковым символам.

Вы можете replace все (.)\1+, чтобы получить все символы, которые не следуют за собой

let str = 'aabbbcddg'
let unmatched = str.replace(/(.)\1+/g, '')[0]

console.log(unmatched)

Вы также можете использовать цикл for, если хотите, чтобы break, когда совпадение найдено

let str = 'aabbbcddg',
  found;

for (let i = 0; i < str.length; i++) {
  if (str[i - 1] !== str[i] && str[i] !== str[i + 1]) {
    found = str[i];
    break;
  }
}

console.log(found)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...