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

Я делаю это регулярное выражение

[:|;]{1}([\\(|\\)|D|p]|[-\\(]|[-\\)]){1}

для этого кандидата

:) :) x-] :ox ;-( ;-) ;~( :~D ;)

здесь https://regex101.com/r/3swEO2/3/

Ожидаемый результат – совпадение :) :) ;-( ;-)

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

Подсказка для правильных групп будет оценена!

Итак, вам нужно сопоставить двоеточие без дефиса и точку с запятой с дефисом?

CinCout 24.07.2019 11:51

Вы можете использовать минусы, вам просто нужно экранировать их обратным слэшем (или 2, так как это для Java)

Mysterious Wolf 24.07.2019 11:56

@CinCout двоеточие с дефисом или без него и точка с запятой только с дефисом!

Leder 24.07.2019 13:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Зачем пытаться сопоставить его в той же группе? Просто добавьте еще одну часть, соответствующую квантификатору {0, 1}.

[:|;]{1}\-{0,1}([\(|\)|D|p]){1}

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


Изменить для комментария:

В этом случае вы можете сделать что-то вроде этого:

:\)|[:|;]{1}\-{1}([\(|\)|D|p]){1}

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

:\)|;-\(|;-\)

Изменить для комментария № 2:

Я протестировал его, и он отлично работает:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class test {
    public static void main(String[] args) {
        String s = ":) :) x-] :ox ;-( ;-) ;~( :~D ;)";
        Pattern patt = Pattern.compile(":\\)|;-\\(|;-\\)");
        Matcher m = patt.matcher(s);

        while (m.find())
            System.out.print(m.group() + " ");
    }
}

Выводит все 4 совпадения: :) :) ;-( ;-)

Я расширил свой ответ, чтобы лучше соответствовать вашим требованиям.

Mysterious Wolf 24.07.2019 12:51

спасибо! перечисление не работает. Мне просто нужно исключить ;) из приведенного вами шаблона: [?!;\)] что-то в этом роде?

Leder 24.07.2019 13:38

Протестировал, и все работает, как и ожидалось (мой пример добавлен к исходному ответу).

Mysterious Wolf 24.07.2019 14:04
Ответ принят как подходящий

Это должно сделать:

(:-?[\|DdPpXx\[\])(]|;-[\|DdPpXx\[\])(])

[\|DdPpXx\[\])(] — это набор символов, который можно использовать для покрытия всех возможных символов.

Кроме этого, я использую трубку ИЛИ |, чтобы покрыть два случая относительно : и ;.

Демо

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