Как QRegExp [propertyID=все]?

Я разбираю файл, который содержит следующие пакеты:

[propertyID="123000"] { 
  fillColor : #f3f1ed;
  minSize : 5;
  lineWidth : 3;
}

Чтобы сканировать только этот фрагмент [propertyID="123000"], у меня есть этот QRegExp

QRegExp("^\b\[propertyID=\"c+\"\]\b");

но это не работает? Здесь у меня есть пример кода для анализа этого файла выше:

QRegExp propertyIDExp= QRegExp("\\[propertyID=\".*\"]");
propertyIDExp.setMinimal(true);

QFile inputFile(fileName);
if (inputFile.open(QIODevice::ReadOnly))
{
    QTextStream in(&inputFile);
    while (!in.atEnd())
    {
        QString line = in.readLine();

        // if does not catch if line is for instance
        // [propertyID="123000"] {
        if( line.contains(propertyIDExp) )
        {
            //.. further processing
        }
    }
    inputFile.close();
}

person Ralf Wickum    schedule 19.08.2015    source источник
comment
QRegExp("\[propertyID=\"\d+\"\]") ???????????? что такое c   -  person vks    schedule 19.08.2015
comment
@vks c = символ ?   -  person Ralf Wickum    schedule 19.08.2015
comment
Нет, это не так.....используйте \d для numbers и . для любого символа   -  person vks    schedule 19.08.2015
comment
Я думаю, вы неправильно поняли документы: c - Символ представляет себя, если он не имеет специального значения регулярного выражения. например c соответствует символу c.   -  person Wiktor Stribiżew    schedule 19.08.2015
comment
CSS не имеет обычного синтаксиса и не может быть проанализирован с помощью регулярных выражений! reg в regex означает регулярные выражения — способ указать обычные синтаксические анализаторы. Когда язык не имеет регулярного синтаксиса, вы не можете использовать регулярное выражение для его разбора (дух). В лучшем случае вы создаете синтаксический анализатор, который будет работать только с некоторыми очень специфическими примерами CSS и отклонит большинство действительных стилей CSS, заставив ваших пользователей страстно ненавидеть вас. Такие взломы крайне непрофессиональны.   -  person Kuba hasn't forgotten Monica    schedule 19.08.2015


Ответы (2)


QRegExp("\\[propertyID=\".+?\"\\]")

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

person vks    schedule 19.08.2015

Используйте следующее выражение:

QRegExp("\\[propertyID=\"\\d+\"]");

См. демонстрацию регулярного выражения.

В регулярном выражении Qt вам нужно экранировать специальные символы регулярного выражения двойными обратными косыми чертами, а для сопоставления цифр вы можете использовать сокращенный класс \d. Кроме того, граница слова \b предотвратила сопоставление вашего регулярного выражения, поскольку оно не может совпадать между началом строки и [ и между ] и пробелом (или вместо этого используйте \B).

Чтобы сопоставить что-либо между кавычками, используйте отрицательный класс символов:

QRegExp("\\[propertyID=\"[^\"]*\"]");

См. другую демонстрацию

В качестве альтернативы вы можете использовать ленивое сопоставление точек с помощью .* и QRegExp::setMinimal():

QRegExp rx("\\[propertyID=\".*\"]");
rx.setMinimal(true);

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

person Wiktor Stribiżew    schedule 19.08.2015
comment
d для десятичного числа. Что я могу использовать для любой строки. Идентификатор также может содержать такие строки, как [propertyID=circle] - person Ralf Wickum; 19.08.2015
comment
Я обновил ответ с предложением QRegExp("\\[propertyID=\"[^\"]*\"]");. Если вы хотите исключить результаты с пустой строкой внутри двойных кавычек, используйте + вместо *. - person Wiktor Stribiżew; 19.08.2015
comment
Если вам нужно разрешить только английские символы внутри кавычек, используйте QRegExp("\\[propertyID=\"[A-Za-z]*\"]");. - person Wiktor Stribiżew; 19.08.2015
comment
QRegExp(\[propertyID=\.*\]) у меня не работает. У меня есть английские символы, цифры и некоторые специальные символы, такие как '?' QRegExp(\[propertyID=\[^\]*\]); ни один. - person Ralf Wickum; 20.08.2015
comment
Возможно, вам подойдет любой из них: 1) QRegExp propertyIDExp("\\[propertyID=\".*\"\\]");, 2) QRegExp propertyIDExp("[[]propertyID\\s*=\\s*\".*\"[]]");, 3) if (propertyIDExp.indexIn(line) > -1) {...}; - person Wiktor Stribiżew; 20.08.2015