Я делаю это регулярное выражение
[:|;]{1}([\\(|\\)|D|p]|[-\\(]|[-\\)]){1}
для этого кандидата
:) :) x-] :ox ;-( ;-) ;~( :~D ;)
здесь https://regex101.com/r/3swEO2/3/
Ожидаемый результат – совпадение :) :) ;-( ;-)
Но я не могу создать шаблон с минусами, которые распознаются как диапазоны, если они не находятся в начале группы сопоставления.
Подсказка для правильных групп будет оценена!
Вы можете использовать минусы, вам просто нужно экранировать их обратным слэшем (или 2, так как это для Java)
@CinCout двоеточие с дефисом или без него и точка с запятой только с дефисом!




Зачем пытаться сопоставить его в той же группе? Просто добавьте еще одну часть, соответствующую квантификатору {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 совпадения: :) :) ;-( ;-)
Я расширил свой ответ, чтобы лучше соответствовать вашим требованиям.
спасибо! перечисление не работает. Мне просто нужно исключить ;) из приведенного вами шаблона: [?!;\)] что-то в этом роде?
Протестировал, и все работает, как и ожидалось (мой пример добавлен к исходному ответу).
Это должно сделать:
(:-?[\|DdPpXx\[\])(]|;-[\|DdPpXx\[\])(])
[\|DdPpXx\[\])(] — это набор символов, который можно использовать для покрытия всех возможных символов.
Кроме этого, я использую трубку ИЛИ |, чтобы покрыть два случая относительно : и ;.
Итак, вам нужно сопоставить двоеточие без дефиса и точку с запятой с дефисом?