Saya mencoba menggunakan std :: regex dalam kode C ++ 11, tetapi tampaknya dukungannya agak bermasalah. Sebuah contoh:
#include <regex>
#include <iostream>
int main (int argc, const char * argv[]) {
std::regex r("st|mt|tr");
std::cerr << "st|mt|tr" << " matches st? " << std::regex_match("st", r) << std::endl;
std::cerr << "st|mt|tr" << " matches mt? " << std::regex_match("mt", r) << std::endl;
std::cerr << "st|mt|tr" << " matches tr? " << std::regex_match("tr", r) << std::endl;
}
keluaran:
st|mt|tr matches st? 1
st|mt|tr matches mt? 1
st|mt|tr matches tr? 0
ketika dikompilasi dengan gcc (MacPorts gcc47 4.7.1_2) 4.7.1, baik dengan
g++ *.cc -o test -std=c++11
g++ *.cc -o test -std=c++0x
atau
g++ *.cc -o test -std=gnu++0x
Selain itu, regex berfungsi dengan baik jika saya hanya memiliki dua pola alternatif, misalnya st|mt
, jadi sepertinya yang terakhir tidak cocok karena beberapa alasan. Kode bekerja dengan baik dengan kompiler LLVM Apple.
Ada ide tentang cara mengatasi masalah ini?
Perbarui satu solusi yang mungkin adalah dengan menggunakan grup untuk mengimplementasikan beberapa alternatif, misalnya (st|mt)|tr
.
<regex>
dukungan libstdc ++ tidak lengkap. Apa yang bisa kami bantu?regex
di libstdc ++, lihat gcc.gnu.org/onlinedocs/libstdc++/manual/…<regex>
dalam 3-4 tahun terakhir (seperti: tetap tidak diterapkan).<regex>
disediakan oleh libstdc ++ (pustaka standar GCC) bukangcc
(ujung depan kompilator), ini adalah bagian dari GCC (proyek). Lihat "libstdc ++ - v3 dikembangkan dan dirilis sebagai bagian dari GCC" . Jika distro Anda memilih untuk membaginya menjadi paket terpisah, itu tidak ada hubungannya dengan GCC.Jawaban:
<regex>
diimplementasikan dan dirilis di GCC 4.9.0.Di GCC versi (lama) Anda, ini tidak diterapkan .
<regex>
Kode prototipe tersebut ditambahkan ketika semua dukungan C ++ 0x GCC sangat eksperimental, melacak draf C ++ 0x awal dan tersedia bagi orang-orang untuk bereksperimen. Hal itu memungkinkan orang untuk menemukan masalah dan memberikan umpan balik kepada panitia standar sebelum standar diselesaikan. Pada saat itu, banyak orang bersyukur telah memiliki akses ke fitur-fitur terbaru jauh sebelum C ++ 11 selesai dan sebelum banyak kompiler lain memberikan dukungan apa pun , dan umpan balik tersebut sangat membantu meningkatkan C ++ 11. Ini adalah Good Thing TM .The
<regex>
kode tidak pernah dalam keadaan berguna, tetapi ditambahkan sebagai karya-in-progress seperti banyak potongan lain kode pada saat itu. Itu diperiksa dan tersedia bagi orang lain untuk berkolaborasi jika mereka mau, dengan maksud bahwa itu akan selesai pada akhirnya.Begitulah cara kerja open source: Rilis lebih awal, sering rilis - sayangnya dalam kasus ini
<regex>
kami hanya mendapatkan bagian awal yang benar dan bukan bagian yang sering menyelesaikan implementasi.Sebagian besar pustaka lebih lengkap dan sekarang hampir sepenuhnya diimplementasikan, tetapi
<regex>
belum, jadi pustaka tetap dalam keadaan belum selesai yang sama sejak ditambahkan.Beberapa tahun yang lalu, ini bukanlah ide yang buruk, ketika C ++ 0x masih dalam proses dan kami mengirimkan banyak implementasi parsial. Tidak ada yang mengira itu akan tetap tidak dapat digunakan begitu lama jadi, dengan melihat ke belakang, mungkin itu seharusnya dinonaktifkan dan membutuhkan opsi makro atau waktu bawaan untuk mengaktifkannya. Tapi kapal itu sudah lama berlayar. Ada simbol yang diekspor dari libstdc ++. Jadi pustaka yang bergantung pada kode regex, jadi cukup menghapusnya (dalam, katakanlah, GCC 4.8) tidak akan sepele.
sumber
Deteksi Fitur
Ini adalah potongan untuk mendeteksi jika
libstdc++
implementasi diimplementasikan dengan C preprocessor mendefinisikan:Makro
_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT
adalah didefinisikan dibits/regex.tcc
dalam4.9.x
_GLIBCXX_REGEX_STATE_LIMIT
adalah didefinisikan dibits/regex_automatron.h
dalam5+
_GLIBCXX_RELEASE
ditambahkan ke7+
sebagai hasil dari jawaban ini dan merupakan versi utama GCCMenguji
Anda dapat mengujinya dengan GCC seperti ini:
Hasil
Berikut beberapa hasil untuk berbagai kompiler:
Ini Naga
Ini sama sekali tidak didukung dan bergantung pada deteksi makro pribadi yang telah dimasukkan oleh pengembang GCC ke dalam
bits/regex*
header. Mereka bisa berubah dan pergi kapan saja . Mudah-mudahan, mereka tidak akan dihapus di rilis 4.9.x, 5.x, 6.x saat ini tetapi mereka bisa hilang di rilis 7.x.Jika pengembang GCC menambahkan
#define _GLIBCXX_HAVE_WORKING_REGEX 1
(atau sesuatu, petunjuk petunjuk dorongan) dalam rilis 7.x yang bertahan, cuplikan ini dapat diperbarui untuk menyertakannya dan rilis GCC selanjutnya akan bekerja dengan cuplikan di atas.Sejauh yang saya tahu, semua kompiler lainnya memiliki kerja
<regex>
saat__cplusplus >= 201103L
tapi YMMV.Jelas ini akan benar-benar rusak jika seseorang mendefinisikan
_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT
atau_GLIBCXX_REGEX_STATE_LIMIT
makro di luarstdc++-v3
tajuk.sumber
_GLIBCXX_REGEX_IS_OK_NOW_KTHXBAI
di header, agar tidak terlupakan - terima kasih!Saat ini (menggunakan std = c ++ 14 di g ++ (GCC) 4.9.2) masih belum menerima regex_match.
Berikut adalah pendekatan yang bekerja seperti regex_match tetapi menggunakan sregex_token_iterator sebagai gantinya. Dan itu bekerja dengan g ++.
itu akan mencetak 1 2 3
Anda dapat membaca referensi sregex_token_iterator di: http://en.cppreference.com/w/cpp/regex/regex_token_iterator
sumber
std::regex_search
, lihat wandbox.org/permlink/rLbGyYcYGNsBWsaB