Ищите любого персонажа, который окружает одного из персонажей, включая себя - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь написать код регулярного выражения, чтобы найти все примеры любого символа, который окружает один из символов, включая самого себя, в приведенной ниже строке:

b9fgh9f1; 2w; 111b2b35hw3w3ww55

Итак 'b2b 'и' 111 'были бы действительны, но' 3ww5 'не были бы.

Может кто-нибудь помочь мне здесь?

Спасибо, Nikhil

1 Ответ

0 голосов
/ 26 февраля 2019

Вы можете использовать это регулярное выражение, которое будет соответствовать трем символам, где первый и третий совпадают, используя обратную ссылку, где в качестве среднего может быть любой,

(.).\1

Демо

Редактировать:

Выше регулярное выражение даст только неперекрывающиеся совпадения, но, так как вы хотите получить все совпадения, которые даже перекрываются, вы можете использовать этот положительныйпосмотрите на регулярное выражение, которое не использует следующие два символа, а группирует их в group2, поэтому для желаемого результата вы можете добавлять символы из group1 и group2.

(.)(?=(.\1))

Демонстрация ссовпадения совпадений

Вот код Java (я никогда не программировал на Ruby), демонстрирующий код и ту же логику, которую вы можете написать на своем любимом языке программирования.

String s = "b9fgh9f1;2w;111b2b35hw3w3ww55";
Pattern p = Pattern.compile("(.)(?=(.\\1))");
Matcher m = p.matcher(s);

while(m.find()) {
    System.out.println(m.group(1) + m.group(2));
}

Печатает все ваши предполагаемые совпадения,

111
b2b
w3w
3w3
w3w

Кроме того, вот код Python, который может помочь, если вы знаете Python,

import re

s = 'b9fgh9f1;2w;111b2b35hw3w3ww55'

matches = re.findall(r'(.)(?=(.\1))',s)
for m in re.findall(r'(.)(?=(.\1))',s):
 print(m[0]+m[1])

Печатает все ваши ожидаемые совпадения,

111
b2b
w3w
3w3
w3w
...