2015-02-17 2 views
3

Хорошо, так что следующая строка является то, что мое регулярное выражение будет пытаться соответствовать против:Qt Regex Помощь (массив ключей)

[key1][key2][key3] 

и вот мое регулярное выражение.

\[(.+?)\] 

Это все делается в Qt, а вот код, я использую

QRegExp reg("\\[(.+?)\\]"); 
reg.indexIn(string); 
qDebug() << "Matches: " << reg.capturedTexts(); 

Вышеизложенные возвращает это:

("", "") 

Так два вопроса, то:

  1. Почему пустые записи
  2. В моем регулярном выражении, почему мне нужно положить \\ для его работы? Если я просто положил \, он ничего не захватит.

Спасибо!

+1

Не могли бы вы попробовать '\\ [([^ \\]] +) \\]' вместо этого? – dasblinkenlight

+0

Хорошо, я получил key1, но теперь, как мне получить 2 других? reg.captureCount() возвращает 1. – DerishOrie

+0

есть ли способ включить глобальный модификатор? –

ответ

0

Во-первых, давайте оптимизируем ваше регулярное выражение: вместо .+? выражение неохотного использования использует [^\]]+, что позволяет избежать так называемого catastrophic backtracking. Новое выражение выглядит следующим образом:

\\[([^\\]]+)\\] 

На моем регулярном выражении, почему мне нужно поставить \\ для его работы?

Поскольку регулярное выражение проходит через два компиляторы, которые обращают внимание на обратную косую черту - во-первых, ваш компилятор C++, а затем регулярных выражений компилятором внутри QRegExp конструктора. Первый косой чертой пары является компилятор C++; второй - для компилятора регулярных выражений. Как только компилятор C++ закончен, каждая пара backslahses заменяется одной косой чертой, что и требует регулярное выражение.

У меня есть key1, но теперь, как я могу получить другие 2? reg.capturedCount() возвращается 1

Ваше регулярное выражение фиксирует одну квадратную скобку - разделительный элемент за раз. Если вы хотите их захватить, вам нужен цикл:

+1

Спасибо! Это сработало – DerishOrie