[linux-l] regex problem

Olaf Radicke briefkasten at olaf-radicke.de
Mo Nov 7 16:32:02 CET 2011


 Hi!

 Am Sonntag, den 06.11.2011, 20:10 +0100 schrieb Pascal Bernhard 
 <pascal.hasko.bernhard at googlemail.com>:
>>>
>>> echo "erst was, 5\% dann % ein %-kommentar." | sed
>>> 's/^\(.*\)[^\\]*%.*$/\1/g;s/^\(.*\)[^\\]*%.*$/\1/g'
>>
>>  Ich hätte nicht gedacht, das dass so schwer zu filtern ist.
>
> funktioniert dieser letzte Ansatz?.Interessante Sache, denn ich 
> musste
> mal die LaTeX-Befehle per Hand aus einem Text löschen, da ich von 
> regex
> keine Ahnung habe, und dies hat mächtig genervt

 Ja, offenbar scheint es zu funktionieren. Ich muss aber dazu sagen,
 das ich den regex für die C++_lib Boost (http://www.boost.org/) 
 brauche.
 Und für diesen Zweck musste ich noch weitere Modifikationen vornehmen.

 Die Sache sieht jetzt bei mir so aus:


 #include <boost/regex.hpp>

 // [...] weiterer Code.

     // More detais to boost::regex see:
     // 
 http://www.boost.org/doc/libs/1_47_0/libs/regex/doc/html/boost_regex/syntax/basic_syntax.html
     // It is in use a case sensitive POSIX-Basic expression. The 
 POSIX-Basic
     // regular expression syntax is used by the Unix utility sed, and
     // variations are used by grep and emacs.
     boost::regex pattern
     (
         "(^\\(.*\\)[^\\\\]*%.*$)|(/^\\(.*\\)[^\\\\]*%.*$)",
         boost::regex::basic
     );
     std::string stringa = TexParser::completeDoc;
     std::string replace ("");
     std::string newString;
     newString = boost::regex_replace (stringa, pattern, replace);
     std::cerr << "###############################################" << 
 std::endl;
     printf("The new string is: |%s|\n",newString.c_str());
     std::cerr << "###############################################" << 
 std::endl;



 Ich bin noch nicht so ganz schlüssig, ob...

 A) ...der Code lesbar/wartbar ist.
 B) ...die ökonomischte Lösung (Ausführungsgeschwindigkeit) ist.

 Auf alle fälle brauch sie nur ein Bruchteil von Code, den ich auf
 dem "Fussweg" verbauen müsste:

 std::string TexParser::findAndRemoveComments(const std::string 
 &read_line)
 {
     std::string line = read_line;
     if( line.size() == 0 )
     {
         return "";
     }
     size_t found_index = line.find("%");
     if(found_index == std::string::npos)
     {
         // no '%' found. Get back all.
         std::cout << "Kein % gefunden! in: \n " << line  << std::endl;
         return line;
     }
     if( found_index == 0)
     {
         // is on the begin of the line.
         std::cout << "% am Anfang gefunden." << std::endl;
         return "";
     }
     if( line.at(found_index -1) != '\\')
     {
         std::cout << "Unmaskiertes % gefunden!" <<  std::endl;
         return line.substr( 0, found_index );
     }

     do
     {
         std::cout << "Maskiertes % gefunden!" <<  std::endl;
         found_index = line.find("%", (found_index + 1));
         if(found_index != std::string::npos)
         {
             if( line[(found_index -1)] != '\\')
             {
                 std::cout << "Unmaskiertes % gefunden!" <<  std::endl;
                 line = line.substr( 0, found_index );
                 break;
             }
         } else
         {
             std::cout << "Kein weiteren % gefunden!" <<  std::endl;
             break;
         }
     }while( true );
     // no more  '%' found. Get back all.
     return line;

 }

 Der ganze Sinn der Übung ist, das ich erwäge einen Converter zu 
 schreiben,
 um aus LaTeX ePUBs zu erstellen. Ich arbeite schon seid ein paar 
 Monaten
 an einem LaTeX Buch, was ich gerne auch als ePUB/HTML anbieten will, 
 aber
 ich habe keine vernünftigen Tools gefunden. latex2html wird offenbar 
 nicht
 mehr gepflegt, hat Probleme mit Umlauten und Anführungszeichen und 
 sieht
 auch nicht so toll aus.

 latex2html ist in Perl geschrieben. Der Code besteht aus einer einzigen
 Datei und ist in der Ausführung auch nicht wirklich schnell.

 Wer meine Bemühungen weiter verfolgen will, sei auf
 https://github.com/OlafRadicke/TeXConv.html verwiesen.

 Da ich das nur nebenher mache, wird sich das aber noch Monate 
 hinziehen.

 Gruß

 Olaf



Mehr Informationen über die Mailingliste linux-l