2016-03-19 24 views
0

Belirli satırları kaldırmak istiyorum ('aaa' ve 'bbb'), çok satırlı bir dizeden standart C++ regex kitaplığına sahip olmak istiyorum. ECMAScript ile sözdizimini değiştirin, sonraki deseni kullanıyorum: /^(aaa|bbb)$/gm. , std::regex_replace için regex argümanı gibi bir şey geçirmeyi denedim, ancak ^ ve $ gibi match_not_eol veya match_not_bol eşleşme bayraklarını geçemediğim halde satırın sonu ve eşleşmiyor gibi görünmüyor. Peki bu durumda C++ deseni nasıl görünmeli?C++ regex: bir çizgiyi birden çok satırda değiştirin

+0

çevrimiçi bir derleyici kopyalanıp yapıştırılması edilebilir bir şey gönderebilir miyim? – Mikhail

+1

Eğer reddederseniz, açıklamaya dikkat edin, neden "Sizce bu soru hiçbir araştırma çabası göstermemektedir; belirsiz veya faydalı değildir". Teşekkürler – tonso

+0

Düşürmedim ... – Mikhail

cevap

1

regex_replace başvuru ^ ve $ anlamlarını yeniden tanımlayan herhangi bir bayrağı listelemez. Bu nedenle, satırlarını satırında aramanız ve değiştirmeniz gerektiğinde, önce (^|\r?\n) yakalama grubunu ve ana desenden sonra bir (?=\r?\n|$) gözatını kullanın (ve geri tepme $1 ile değiştirin). Kuşkusuz, kalıplar, değişimden sonra boş hatlara izin vermek ya da olmamak için ayarlanabilir.

görün IDEONE demo:

std::string s("ccc\r\naaa\r\ngggg"); 
std::regex ee(R"((^|\r?\n)(?:aaa|bbb)(?=\r?\n|$))"); 
std::string newtext = std::regex_replace(s, ee, "$1"); 
std::cout << newtext << std::endl; 

Çıktı:

ccc 

gggg 
+0

Yanıtladığınız için teşekkür ederiz. Aslında "(^ | \ n)" harfini başlangıçta ve "($ | \ n)" eşlemenin sonunda eşlemek gibi bir şey denedim, ama öyle görünüyor ki, önceki satırın olması durumunda satır eşleşmiyor büyük olasılıkla, "(^ | \ n)" başlangıcı önceki eşleşmenin parçası olduğu için değiştirilmiştir. Örneği R "((^ | r? \ N) (?: ccc | aaa | bbb) (\ r? \ N | $)) ile değiştirirseniz, örneğinizde ne hakkında konuştuğumu görebilirsiniz. . – tonso

+0

Bu durumda, takip yakalama grubunu bir bakış noktasına dönüştürün. Std :: regex ee (R "((^ | \ r? \ N) (?: aaa | bbb) (? = \ R? \ N | $))"); 'kullanın ve bir geri referansla değiştirin $ 1 $ '. –

+0

Eğer '(? = \ R? \ N | $)' kullanırsam, segfault ile sonuçlanır, çünkü '$' lookahead'de yer alır, sanırım, ama ben kullanırsam ((? = \ R? \ N)) | $) 'Tamam. Yardım için teşekkürler – tonso

İlgili konular