iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang 正则匹配效率详解
  • 291
分享到

Golang 正则匹配效率详解

2024-04-02 19:04:59 291人浏览 独家记忆
摘要

最近有个小需求,校验IMEI是否为15位纯数字(是否合法) 以下是正则匹配 与自己实现的简单验证方式进行压测 package main import ( "regexp"

最近有个小需求,校验IMEI是否为15位纯数字(是否合法)

以下是正则匹配

与自己实现的简单验证方式进行压测


package main
import (
    "regexp"
    "testing"
)
func BenchmarkIsDigitalRegexp(b *testing.B) {
    for i := 0; i < b.N; i++ {
        _ = isDigitalRegexp("358901806972417")
    }
}
func BenchmarkIsDigital(b *testing.B) {
    for i := 0; i < b.N; i++ {
        _ = isDigital("358901806972417")
    }
}
func isDigitalRegexp(imei string) bool {
    if ok, _ := regexp.Match("^[0-9]{15}$", []byte(imei)); ok {
        return true
    }else {
        return false
    }
}
func isDigital(imei string) bool {
    n := len(imei)
    if n == 15 {
        for i := 0; i < n; i++ {
            if imei[i] >= 48 && imei[i] <= 57 {
                continue
            }else {
                return false
            }
        }
    }else {
        return false
    }
    return true
}

压测结果:


C:\Users\M709FjsA\Go\src\pprof_demo\re>go test -bench=. -benchmem
goos: windows
goarch: amd64
pkg: pprof_demo/re
BenchmarkIsDigitalRegexp-12       300000              4644 ns/op            6450 B/op         70 allocs/op
BenchmarkIsDigital-12           200000000                9.48 ns/op            0 B/op          0 allocs/op
PASS
ok      pprof_demo/re   4.577s

很明显,正则需要重新分配内存较多,从pprof生成图也可以看出,正则调用关系错综复杂

在这里插入图片描述

补充:Golang —— 正则表达式

正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具。虽然正则表达式比纯粹的文本匹配效率低,但是它却更灵活。

按照它的语法规则,随需构造出的匹配模式就能够从原始文本中筛选出几乎任何你想要得到的字符组合。

Go语言通过regexp标准包为正则表达式提供了官方支持,如果你已经使用过其他编程语言提供的正则相关功能,那么你应该对Go语言版本的不会太陌生,但是它们之间也有一些小的差异,因为Go实现的是RE2标准,除了\C。

其实字符串处理我们可以使用strings包来进行搜索(Contains、Index)、替换(Replace)和解析(Split、Join)等操作,但是这些都是简单的字符串操作,他们的搜索都是大小写敏感,而且固定的字符串,如果我们需要匹配可变的那种就没办法实现了,当然如果strings包能解决你的问题,那么就尽量使用它来解决。

因为他们足够简单、而且性能和可读性都会比正则好。

正则匹配规则图

详细请参考官方文档

在这里插入图片描述

简单的正则表达式

1. 匹配任意类型


	buf := "abc azc a7c aac 888 a9c tac"
	// 1. 解释规则
	reg := regexp.MustCompile(`a.c`) // 这里会解析正则表达式,成功就返回解释器(. ——> 除\n外任意字符)
	if reg == nil { // 解释失败
		fmt.Println("MustCompile err")
		return
	}
	// 2. 根据规则提取关键信息
	res :=  reg.FindAllStringSubmatch(buf, -1) //-1表示匹配所有的
	// res :=  reg.FindAllStringSubmatch(buf, 1) //1表示匹配一个
	fmt.Println("res = ", res)

执行结果:


res =  [[abc] [azc] [a7c] [aac] [a9c]]

2. 使用 […] (字符集) 匹配[0-9]之间的数值


  buf := "abc azc a7c aac 888 a9c  tac"
 
    //1) 解释规则, 它会解析正则表达式,如果成功返回解释器
    reg1 := regexp.MustCompile(`a[0-9]c`)
 
    if reg1 == nil { //解释失败,返回nil
        fmt.Println("MustCompile err")
        return
    }
 
    //2) 根据规则提取关键信息
    result1 := reg1.FindAllStringSubmatch(buf, -1)
    fmt.Println("result1 = ", result1)

执行结果:


result1 =  [[a7c] [a9c]]

3. 使用 \d 匹配[0-9]之间的数值


  buf := "abc azc a7c aac 888 a9c  tac"
 
    //1) 解释规则, 它会解析正则表达式,如果成功返回解释器
    reg1 := regexp.MustCompile(`a\dc`)
    if reg1 == nil { //解释失败,返回nil
        fmt.Println("MustCompile err")
        return
    }
 
    //2) 根据规则提取关键信息
    result1 := reg1.FindAllStringSubmatch(buf, -1)
    fmt.Println("result1 = ", result1)

执行结果:


result1 =  [[a7c] [a9c]]

4.匹配小数


 buf := "3.14 456 adsc as23D 1.23 3. 9.99 1lsa23d 0.08 0.00  "
 // 解释正则表达式
 reg := regexp.MustCompile(`\d+\.\d+`) // +表示匹配前一个字符的一次或者多次
 if reg == nil {
  fmt.Println("MustCompile err")
  return
 }
 // 提取关键信息
 res := reg.FindAllStringSubmatch(buf, -1)
 fmt.Println("res = ", res)

执行结果:


res =  [[3.14] [1.23] [9.99] [0.08] [0.00]]

5.匹配信息中某关键字并过滤带标签的


	// ` ` 是原生字符串
	buf := `
			<!DOCTYPE html>
			<html lang="zh-CN">
			<head>
				<title>Go语言标准库文档中文版 | Go语言中文网 | golang中文社区 | Golang中国</title>
				<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-Scalable=no">
				<meta Http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
				<meta charset="utf-8">
				<link rel="shortcut icon" href="/static/img/go.ico" rel="external nofollow" >
				<link rel="apple-touch-icon" type="image/png" href="/static/img/logo2.png" rel="external nofollow" >
				<meta name="author" content="polaris <polaris@studygolang.com>">
				<meta name="keyWords" content="中文, 文档, 标准库, Go语言,Golang,Go社区,Go中文社区,Golang中文社区,Go语言社区,Go语言学习,学习Go语言,Go语言学习园地,Golang 中国,Golang中国,Golang China, Go语言论坛, Go语言中文网">
				<meta name="description" content="Go语言文档中文版,Go语言中文网,中国 Golang 社区,Go语言学习园地,致力于构建完善的 Golang 中文社区,Go语言爱好者的学习家园。分享 Go 语言知识,交流使用经验">
			</head>
				<div>和爱好</div>
				<div>哈哈
				你在吗
				不在
				</div>
				<div>测试</div>
				<div>你过来啊</div>
			
			<frameset cols="15,85">
				<frame src="/static/pkgdoc/i.html">
				<frame name="main" src="/static/pkgdoc/main.html" tppabs="main.html" >
				<noframes>
				</noframes>
			</frameset>
			</html>
			`
	// 解释正则表达式
	reg := regexp.MustCompile(`<div>(?s:(.*?))</div>`) // s用来处理换行情况
	if reg == nil {
		fmt.Println("MustCompile err")
		return
	}
	// 提取关键字
	res := reg.FindAllStringSubmatch(buf, -1)
	// fmt.Println("res = ", res)
	// 过滤<> </>
	for _, text := range res {
		//fmt.Println("text[0] = ", text[0]) // 带<> </>的
		fmt.Println("text[1] = ", text[1]) //  不带<> </> 的
	}

执行结果:


text[1] =  和爱好
text[1] =  哈哈
    你在吗
    不在
    
text[1] =  测试
text[1] =  你过来啊

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

您可能感兴趣的文档:

--结束END--

本文标题: Golang 正则匹配效率详解

本文链接: https://www.lsjlt.com/news/124547.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Golang 正则匹配效率详解
    最近有个小需求,校验IMEI是否为15位纯数字(是否合法) 以下是正则匹配 与自己实现的简单验证方式进行压测 package main import ( "regexp"...
    99+
    2024-04-02
  • Python中使用正则表达式及正则表达式匹配规则详解
    目录1 导库2 使用模板3 说明4 示例5 正则表达式匹配规则1 导库 import re 2 使用模板 re_pattern = re.compile(pattern, flags...
    99+
    2023-03-22
    Python正则表达式匹配规则 Python正则表达式
  • python 正则匹配的re.sear
    一个简单的使用re.search 匹配一个字符串中的关键字[root@localhost ~]# vim ceshi.py#!/usr/bin/env python #coding:utf-8 import re err=("stderr:...
    99+
    2023-01-31
    正则 python sear
  • Java 正则表达式匹配
    1 正则表达式 1.1 什么是正则表达式 正则表达式: 定义一个搜索模式的字符串。 正则表达式可以用于搜索、编辑和操作文本。 正则对文本的分析或修改过程为:首先正则表达式应用的是文本字符串(text/string),它会以定义的模式从左到右...
    99+
    2023-10-27
    正则表达式 java 开发语言
  • python 正则匹配手机号
    import rephone = str(input('请输入手机号:'))# b = str(12345678912)t = re.compile(r'^1(3\d|4[4-9]|5[0-35-9]|6[67]|7[013-8]|8[0...
    99+
    2023-01-31
    正则 手机号 python
  • [转]python 正则匹配中文
     python 正则匹配中文    由于 需求原因,需要匹配 提取中文,大量google下,并没有我需要的。花了一个小时大概测试,此utf8中文通过,特留文。    参考: http://hi.baidu.com/nivrrex/...
    99+
    2023-01-31
    正则 中文 python
  • Java中正则表达式匹配过程实例详解
    目录下面是Java正则表达式的语法字符:正则表达式简单的匹配过程:(1) 基础匹配过程(2)贪婪模式(3)非贪婪模式 (4)零宽度匹配过程总结正则表达式:定义字符串的模式,...
    99+
    2024-04-02
  • 正则表达式匹配ip地址超详细讲解
    IP地址是一个由32位二进制数字组成的地址,为了方便表示和理解,通常将其表示为四个以`.`分隔的十进制数。正则表达式可以用来匹配IP...
    99+
    2023-08-09
    正则表达式
  • java正则表达式匹配规则超详细总结
    目录1 单个字符的匹配规则如下:2 多个字符的匹配规则如下:3 复杂匹配规则主要有:4 提取匹配的字符串子段5 非贪婪匹配6 替换和搜索6.1 分割字符串6.2 搜索字符串6.3 替...
    99+
    2024-04-02
  • 全面详解JS正则中匹配技巧及示例
    目录引言组名匹配具名组匹配解构赋值替换前瞻后顾捕获分组补充$&,&n知识点总结引言 在做项目的时候难免会遇到很多奇葩解析字符串的需求,简单的字符串通过内置方法就能解...
    99+
    2023-01-04
    JS正则匹配技巧 JS正则匹配
  • python正则一些简单匹配
    元字符的使用re.findall(regex,string)功能:在string字符串中,匹配regex正则表达式能够匹配的项,放到一个列表中返回* 普通字符串 元字符 :abc  匹配规则 : 匹配字符串的值匹配示例 :abc In [3...
    99+
    2023-01-31
    正则 简单 python
  • js正则test匹配的踩坑及解决
    目录引言这样去匹配,有什么问题吗?为什么是 true 、false 、true 怎么解决呢?引言 本瓜相信你一定经常用以下这种最最简单的正则来判断字符串中是否存在某个子字符(别说了,...
    99+
    2024-04-02
  • php正则匹配不到的解决方法
    小编给大家分享一下php正则匹配不到的解决方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php正则匹配不到的解决办法:1、使用preg_match_all()...
    99+
    2023-06-15
  • AndroidIntentFilter的匹配规则示例详解
    目录前言一、Activity的调用模式1、显式调用2、隐式调用二、IntentFilter匹配规则详解1、Action的匹配规则2、category的匹配规则3、data的匹配规则d...
    99+
    2022-12-09
    Android IntentFilter匹配规则 Android IntentFilter
  • 详解servlet的url-pattern匹配规则
    本文介绍了servlet的url-pattern匹配规则,分享给大家,具体如下:首先需要明确几容易混淆的规则:servlet容器中的匹配规则既不是简单的通配,也不是正则表达式,而是特定的规则。所以不要用通配符或者正则表达式的匹配规则来看待s...
    99+
    2023-05-30
    servlet url-pattern te
  • 如何使用正则匹配最后一个字符串详解
    前几天遇到一个需求,输入的是 <user> <user> <name>a</name> </...
    99+
    2024-04-02
  • 正则表达式之字符串模式匹配实例详解
    目录前言什么是正则表达式字符范围匹配元字符多次重复匹配定位匹配贪婪模式与非贪婪模式表达式分组结语前言 今天我们来学习正则表达式,正则表达式的应用十分广泛,几乎每个涉及到交互的项目都会...
    99+
    2024-04-02
  • 如何用 Golang 正则匹配多个单词或字符串?
    golang 正则表达式使用管道符 | 来匹配多个单词或字符串,将各个选项作为逻辑 or 表达式分隔开来。例如:匹配 "fox" 或 "dog":fox|dog匹配 "quick"、"b...
    99+
    2024-05-14
    golang 正则 python
  • C++中使用正则匹配问题
    目录C/C++可以用正则表达式吗?若要判断一个输入的QQ号是否有效,如何判断?正则程序库(regex)正则文法(regex syntaxes)匹配(Match)搜索(Search)替...
    99+
    2022-11-13
    C++正则匹配 使用正则匹配 C++正则
  • Java匹配正则表达式汇总
    目录一.我们先举个例子来看看Java匹配正则表达式二.匹配表达式的特殊情况java匹配字符串表达式在我们数据处理方面是及其重要的,现在就把我这几天数据处理比较常用的向大家介绍一下,常...
    99+
    2023-03-24
    Java匹配正则表达式 java正则匹配
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作