2013-03-28 5 views
1

У меня есть довольно сложный RegEx, в котором у меня есть некоторые захватив группыДополнительно группа записи

, но это группы в большой группе, и эта большая группа является необязательной

здесь взгляд на ситуацию (я использовать Qt для этого, и QRegularExpression, но я предполагаю, что это на самом деле не имеет значения):

QRegularExpression regex("(.*)(?:([0-9]{2}) ([0-9]{2}) ([0-9]{2}))?(.*)"); 

Теперь я хочу, чтобы заменить матча

QString str = ".....some text...."; 
str.replace(regex, "\\1__\\3__\\5"); 

Возникла проблема, потому что, поскольку 3 группы захвата являются необязательными, иногда \\3 не существует.

То, что я хочу, чтобы получить пустую строку, если одна из группы захвата не существует:

если \\3 есть, я хочу:

"\\1__\\3__\\5" 

, но если это не так, я хочу :

"\\1____\\5" 

вот что я получу, если он не существует:

"...text...__\3__...text..." 

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

Но это возможно сделать только в одном заменить? И как ? И что это лучший способ сделать это?

EDIT

Как amartel показать мне, нет никаких проблем, на самом деле моя ошибка заключалась в том, что я попытался получить доступ к 8-захвата, но там было только 7, так что \\ 8 возвращение меня \ 8

+0

Регулярное выражение в вашем примере плохо, потому что оно соответствует пустой строке. Надеюсь, в реальном приложении все по-другому? Кроме того, вы используете синтаксис без захвата - может быть, проблема? – Amartel

+0

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

ответ

2

Я попытался это:

QRegExp rexp("(A)(?:([0-9]{2}) ([0-9]{2}) ([0-9]{2}))?(Z)"); 

QString s1("qA11 22 33Zq"); 
QString s2("wAZw"); 

s1.replace(rexp, "\\1__\\3__\\5"); 
s2.replace(rexp, "\\1__\\3__\\5"); 

qDebug() << s1; 
qDebug() << s2; 

И выход был:

"qA__22__Zq" 
"wA____Zw" 

Пусть ваша проблема где-то в другом месте?

+0

Возможно, я буду искать причину, и я дам вам знать. – BlueMagma

+0

Вы правы, мне очень стыдно. .. Я, должно быть, считал не захватывающим, как захват. Так что моего последнего захвата не было. Благодарю вас за время. Поскольку вопрос явно является ошибкой, следует ли его удалить? – BlueMagma

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