【记录】go语言中用正则表达式查找某个值

【背景】

折腾:

【记录】用go语言实现模拟登陆百度

期间,需要对于:

bdPass.api.params.login_token='eba6a0434994bd6b1841386f639929cf';

去提取出:

eba6a0434994bd6b1841386f639929cf

所以需要用用到go语言的正则去提取。

【折腾过程】

1.官网解释:

http://golang.org/pkg/regexp/

2.参考:

What’s in a Match?

去试试。

然后其中go的正则的语法,参考:

http://code.google.com/p/re2/wiki/Syntax

去用:

    //bdPass.api.params.login_token='278623fc5463aa25b0189ddd34165592';
    //use regex to extract login_token
    loginTokenP, _ := regexp.Compile(`bdPass\.api\.params\.login_token='(?P<loginToken>\w+)';`)
    loginToken := loginTokenP.FindString(getApiRespHtml);
    gLogger.Info("loginToken=%s", loginToken);

结果输出的是全部匹配的内容:

loginToken=bdPass.api.params.login_token=’122f1d7272bc7801c08542131d28dffb’;

3.所以,再去看看如何获得group中的内容。

再参考:

Groups

看到是用FindAllStringSubmatch

再去看看语法:

http://golang.org/pkg/regexp/#Regexp.FindAllStringSubmatch

但是看着感觉很不好用。

是不是需要找个非All版本的SubMatch?

4.也看到另外一个:

http://golang.org/pkg/regexp/#Regexp.FindStringSubmatchIndex

和:

http://golang.org/pkg/regexp/#Regexp.FindSubmatch

另外再参考:

Groups

去试试:FindStringSubmatch

用代码:

    //bdPass.api.params.login_token='278623fc5463aa25b0189ddd34165592';
    //use regex to extract login_token
    loginTokenP, _ := regexp.Compile(`bdPass\.api\.params\.login_token='(?P<loginToken>\w+)';`)
    //loginToken := loginTokenP.FindString(getApiRespHtml);
    //loginToken := loginTokenP.FindSubmatch(getApiRespHtml);
    loginToken := loginTokenP.FindStringSubmatch(getApiRespHtml);
    gLogger.Info("loginToken=%s", loginToken);

输出结果是:

loginToken=[bdPass.api.params.login_token=’89287333cba4a6225713c0a9544b5d40′; 89287333cba4a6225713c0a9544b5d40]

5.最终,是通过如下代码:

    //bdPass.api.params.login_token='278623fc5463aa25b0189ddd34165592';
    //use regex to extract login_token
    loginTokenP, _ := regexp.Compile(`bdPass\.api\.params\.login_token='(?P<loginToken>\w+)';`)
    //loginToken := loginTokenP.FindString(getApiRespHtml);
    //loginToken := loginTokenP.FindSubmatch(getApiRespHtml);
    foundLoginToken := loginTokenP.FindStringSubmatch(getApiRespHtml);
    gLogger.Debug("foundLoginToken=%s", foundLoginToken);
    if nil != foundLoginToken {
        loginToken := foundLoginToken[1] //tmp go regex not support named group, so use index here
        gLogger.Info("found loginToken=%s", loginToken);
    } else {
        gLogger.Warn(" not found loginToken from html=%s", getApiRespHtml);
    }

可以输出:

found loginToken=962e3720455ccfcafc374cef77c0c507

6.关于通过group的名字获得所查找到的内容,go中不支持。

但是有人:

Using the Go Regexp Package

是已经实现了。

但是还是那句:

go的正则本身不支持,从这点来说,还是很挫的。

等待go以后继续发展,继续支持吧。

 

【总结】

对于如何字符串:

var bdPass=bdPass||{};
bdPass.api=bdPass.api||{};
bdPass.api.params=bdPass.api.params||{};
bdPass.api.params.login_token='962e3720455ccfcafc374cef77c0c507';
	bdPass.api.params.login_tpl='mn';

			document.write('<script type="text/javascript" charset="UTF-8" src="https://passport.baidu.com/js/v2ApiUsedTangramFunctions.js?v=20130916"></script>');
		document.write('<script type="text/javascript" charset="UTF-8" src="https://passport.baidu.com/js/pass_api_login.js?v=20130916"></script>');

通过如下代码:

    //bdPass.api.params.login_token='278623fc5463aa25b0189ddd34165592';
    //use regex to extract login_token
    loginTokenP, _ := regexp.Compile(`bdPass\.api\.params\.login_token='(?P<loginToken>\w+)';`)
    //loginToken := loginTokenP.FindString(getApiRespHtml);
    //loginToken := loginTokenP.FindSubmatch(getApiRespHtml);
    foundLoginToken := loginTokenP.FindStringSubmatch(getApiRespHtml);
    gLogger.Debug("foundLoginToken=%s", foundLoginToken);
    if nil != foundLoginToken {
        loginToken := foundLoginToken[1] //tmp go regex not support named group, so use index here
        gLogger.Info("found loginToken=%s", loginToken);
    } else {
        gLogger.Warn(" not found loginToken from html=%s", getApiRespHtml);
    }

可以获得所要的:

found loginToken=962e3720455ccfcafc374cef77c0c507

的。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量