что не так с моей функцией регулярного выражения C ++ boost? - PullRequest
0 голосов
/ 04 сентября 2010

включает

#include <algorithm>
#include<boost/algorithm/string.hpp>
#include<boost/regex.hpp>
  using namespace std;
  using namespace boost;

  string _getBasehtttp(string url)
  {

        regex exrp( "^(?:http://)?([^\\/]+)(.*)$" );

        match_results<string::const_iterator> what;

        if( regex_search( url, what, exrp ) )

        {

            string base( what[1].first, what[1].second );

            return base;
        }
        return "";
 }
int main( ) {

   cout << _getBasehtttp("httpasd://www.google.co.in");
}

если я ввожу http://www.google.co.in я получаю возвращенное значение www.google.com, но если я ввожу httpasd://www.google.co.in, я получаю httpasd .. не должно быть никакого совпадения, если я получаю совпадение ???

Ответы [ 2 ]

2 голосов
/ 04 сентября 2010

http:// не совпадает, но тогда это необязательно, так что это не проблема;«один или несколько символов, которые не являются косыми чертами», соответствует httpasd:, и, конечно, .* затем соответствует всему, что следует, начиная с косой черты (включенной) и далее.Это будет работать так же, как и в любой обычной реализации регулярных выражений, ничего особенного в c ++ нет!

0 голосов
/ 04 сентября 2010

^(?:http://)?([^\\/]+)(.*)$

?в конце (?:http://)? означает, что бит является необязательным
, этот ([^\\/]+) захватывает и сопоставляет все, что не является \ или /
, этот (.*) захватывает все остальное до конца строки

Возможно, вы после чего-то более похожего на ^(?:https?://)([^\\/]+)(.*)$

, возможно, захотите рассмотреть полный синтаксис URL в соответствии с

 file://                                        /C:/temp/app/example.html
 file://     C                             :    /temp/app/example.html
 file://     C                             :    \temp\app\example.html
 http://user@www.hotmail.passport.login.net:8080/test/url.htm?view=smart
[method][               server                   ][   path   ][optional]
        [user][         domain             ][port]

Тогда ваш заголовок для регулярного выражения будет больше похож на

([a-zA-Z][a-zA-Z0-9\\+\\-\\.]*://)?(([^@/\\\\]+@)?([a-zA-Z0-9_'!~\\-,;&=\\.\\$\\*\\(\\)\\+]+)(:\\d*)?)?([/\\\\][^?]*)?(\\?.*)?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...