Захват нескольких текстов. - PullRequest
2 голосов
/ 29 июля 2011

У меня проблема с регулярными выражениями.

Предположим, что у нас есть строка

 S= "[sometext1],[sometext],[sometext]....,[sometext]"

Число «sometexts» неизвестно, это ввод пользователя и может варьироваться от одного до.. например, 1000.

[sometext] - это некоторая последовательность символов, но каждый из них не является ",", поэтому мы можем сказать [^,].

Я хочузахватить текст с помощью некоторого регулярного выражения, а затем перебрать текст в цикле.

QRegExp p=new QRegExp("???");
p.exactMatch(S);
for(int i=1;i<=p.captureCount;i++)
{
  SomeFunction(p.cap(i));
}

Например, если число sometexts равно 3, мы можем использовать что-то вроде этого:

([^,]*),([^,]*),([^,]*).

Итак, я не знаю, что написать вместо "???"для любого произвольного п.Я использую Qt 4.7, я не нашел, как это сделать на странице ссылок на классы.
Я знаю, что мы можем сделать это через циклы без регулярных выражений или сгенерировать само регулярное выражение в цикле, но эти решения нене подходит мне, потому что реальная проблема немного сложнее, чем эта ..

Ответы [ 3 ]

3 голосов
/ 29 июля 2011

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

([^,]+?)(,|$)

Это будет соответствовать строке, которая заканчивается комой "," или концом строки. Я не был уверен, что последний элемент будет иметь кому или нет.

Пример использования этого регулярного выражения в C #:

String textFromFile = "[sometext1],[sometext2],[sometext3],[sometext4]";

foreach (Match match in Regex.Matches(textFromFile, "([^,]+?)(,|$)"))
{
    String placeHolder = match.Groups[1].Value;

    System.Console.WriteLine(placeHolder);
}

Этот код выводит на экран следующее:

[sometext1]
[sometext2]
[sometext3]
[sometext4]

Использование примера для QRegex, который я нашел в Интернете здесь, является попыткой найти решение ближе к тому, что вы ищете: (пример, который я нашел по адресу: http://doc.qt.nokia.com/qq/qq01-seriously-weird-qregexp.html)

QRegExp rx( "([^,]+?)(,|$)");
rx.setMinimal( TRUE ); // this is if the Qregex does not understand the +? non-greedy notation.

int pos = 0;
while ( (pos = rx.search(text, pos)) != -1 ) 
{
     someFunction(rx.cap(1));
}

Надеюсь, это поможет.

0 голосов
/ 29 июля 2011

Я знаю только .Net, который позволяет вам указывать переменное число захватов с помощью одного
выражения.Пример - (capture. * Me) +
Создает объект захвата, который можно перебирать.Даже тогда он только имитирует
, что обеспечивает каждый другой движок регулярных выражений.

Большинство движков предоставляют пошаговое совпадение, пока в цикле
не осталось совпадений.Флаг global указывает движку продолжать сопоставление с того места, где было остановлено последнее совпадение
.

Пример (в Perl):

while ( $string =~ /([^,]+)/g ) { print $1,"\n" }

0 голосов
/ 29 июля 2011

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

Попробуйте:

QRexExp p=new QRegExp("([^,]*)(?:,([^,]*))*[.]")

Объяснение не захватав документах: http://doc.qt.nokia.com/latest/qregexp.html

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

...