2014-12-09 2 views
0

Мне нужно выражение RegExp, которое выбирает каждую букву один раз в предложении (без учета регистра). Вы можете мне помочь?Регулярное выражение QRegExp

Входная строка:

AaAaaAaaabbacdaasccasddasdascasdasZz

Результат должен быть (в любом порядке):

abcdsz

UPD: ок, я получил его , Нет решения RegExp. Программно решение ниже. (Qt)

+4

Я думаю, что это должно рассматриваться программно не регулярное выражение, нет?! –

+1

Это довольно невозможно в regex, поскольку регулярные выражения будут соответствовать только последовательным символам. Если у вас нет движка, поддерживающего все записи группы, помещенной в lookahead. – Bergi

+0

Грустно слышать это. Спасибо. Я удалю вопрос. – warchantua

ответ

2

Это возможно, с двумя оговорками, каждая буква в их отдельном матче, и нет никакой гарантии, о случае характера (последнее появление персонажа, в верхнем или нижнем регистре независимо, будут выбраны).

(.)(?!.*\1) 

QRegExp implements backreference, and look-ahead, поэтому выше регулярное выражение должно работать.

Его следует использовать с опцией Qt::CaseInsensitive.

. в QRegExp по умолчанию соответствует любому символу без исключения (что эквивалентно наличию опции s на все время в Perl, PCRE, Java и т. Д.), Поэтому в зависимости от вашего требования вы можете удалить все пространство символов в строке первой ..

Demo at regex101 (он использует PCRE двигатель, но не должно быть никакой разницы в поведении для этого регулярного выражения)

+0

О, хорошо, я не думал, что нужно сопоставить глобальное регулярное выражение несколько раз: - / – Bergi

1

решения Программное здесь:

QString s = "AaAaaAaaabbacdaasccasddasdascasdasZz"; 
QString variables = ""; 
for(int i=0;i<s.length(); ++i) 
{ 
     if(s[i].isLetter() && !variables.contains(s[i])) 
       variables+=s[i]; 
} 
// variables = "abcdsz" 

 Смежные вопросы

  • Нет связанных вопросов^_^