iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang如何统计字符串中数字字母的数量
  • 806
分享到

Golang如何统计字符串中数字字母的数量

2023-06-30 18:06:00 806人浏览 八月长安
摘要

今天小编给大家分享一下golang如何统计字符串中数字字母的数量的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.需求说明记

今天小编给大家分享一下golang如何统计字符串中数字字母的数量的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    1.需求说明

    记录一下项目对用户 UGC 文本进行字数限制的具体实现。

    不同的产品,出于种种原因,一般都会对用户输入的文本内容做字数限制。

    • 出于产品定位,比如 140 字符限制的 Twitter,让内容保持简洁凝练,易于阅读;

    • 出于用户的阅读体验,过多的文字会造成阅读疲劳,合适的字数能够提高阅读舒适度;

    • 出于技术与成本的考虑,不设上限的 UGC 内容会引发一些潜在的问题,比如增加存储的成本,降低检索效率等。

    回到自己的项目,是一个用户发帖的业务场景。产品同学给到的要求是:

    • 帖子名称,限制在 25 个字;

    • 帖子正文,限制在 1500 字;

    • 关于字的说明:1 个汉字为一个字,一个 Emoji 表情相当于 1 个字,2 个数字/英文字母相当于 1 个字。

    正常情况下,汉字,Emoji 字符,数字与英文字母都是单独的字符。这里 2 个数字/英文算作 1 个字,所以在计算字符串长度时,不能够使用 []rune 强转后来获取其长度,而是需要统计出数字与英文字母的数量,再加上其他字符数量,作为其长度。所以,要想实现产品同学的要求,关键是需要统计出用户输入文本中的数字与英文字母的数量。

    2.实现

    Golang,一般有两种方法。

    2.1 ASCII 码值法

    数字和英文字母的 ASCII 码值我们是知道的,通过对原字符串遍历,便可统计出数字/英文字母的数量。

    // GetAlphanumericNumByASCII 根据 ASCII 码值获取字母数字数量。func GetAlphanumericNumByASCII(s string) int {num := int(0)for i := 0; i < len(s); i++ {switch {case 48 <= s[i] && s[i] <= 57: // 数字fallthroughcase 65 <= s[i] && s[i] <= 90: // 大写字母fallthroughcase 97 <= s[i] && s[i] <= 122: // 小写字母num++default:}}return num}// 或者// GetAlphanumericNumByASCIIV2 根据 ASCII 码值获取字母数字数量。func GetAlphanumericNumByASCIIV2(s string) int {num := int(0)for _, c := range s {switch {case '0' <= c && c <= '9':fallthroughcase 'a' <= c && c <= 'z':fallthroughcase 'A' <= c && c <= 'Z':num++default:}}return num}

    2.2 正则表达式

    我们可以利用 Golang 标准库包 regexp 获取指定表达式的字串数量。

    // GetAlphanumericNumByRegExp 根据正则表达式获取字母数字数量。func GetAlphanumericNumByRegExp(s string) int {rNum := regexp.MustCompile(`\d`)rLetter := regexp.MustCompile("[a-zA-Z]")return len(rNum.FindAllString(s, -1)) + len(rLetter.FindAllString(s, -1))}

    我们可以写个单测来验证下上面三个函数的正确性。

    package stringimport "testing"func TestGetAlphanumericNumByASCII(t *testing.T) {type args struct {s string}tests := []struct {name stringargs argswant int}{{name: "包含数字",args: args{"108条梁山好汉"},want: 3,},{name: "包含字母",args: args{"一百条梁山man"},want: 3,},{name: "包含数字与字母",args: args{"108条梁山man"},want: 6,},}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {if got := GetAlphanumericNumByASCII(tt.args.s); got != tt.want {t.Errorf("GetAlphanumericNumByASCII() = %v, want %v", got, tt.want)}})}}func TestGetAlphanumericNumByASCIIV2(t *testing.T) {type args struct {s string}tests := []struct {name stringargs argswant int}{{name: "包含数字",args: args{"108条梁山好汉"},want: 3,},{name: "包含字母",args: args{"一百条梁山man"},want: 3,},{name: "包含数字与字母",args: args{"108条梁山man"},want: 6,},}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {if got := GetAlphanumericNumByASCIIV2(tt.args.s); got != tt.want {t.Errorf("GetAlphanumericNumByASCII() = %v, want %v", got, tt.want)}})}}func TestGetAlphanumericNumByRegExp(t *testing.T) {type args struct {s string}tests := []struct {name stringargs argswant int}{{name: "包含数字",args: args{"108条梁山好汉"},want: 3,},{name: "包含字母",args: args{"一百条梁山man"},want: 3,},{name: "包含数字与字母",args: args{"108条梁山man"},want: 6,},}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {if got := GetAlphanumericNumByRegExp(tt.args.s); got != tt.want {t.Errorf("GetAlphanumericNumByRegExp() = %v, want %v", got, tt.want)}})}}

    运行go test main/string命令,其中 main/string 为单元测试所在包的路径。输出如下:

    ok      main/string     0.355s

    验证无误。

    3.性能对比

    上面提到的两种方法都可以用来获取字符串中数字与英文字母的数量,那么我们应该采用哪一种方法呢?

    功能上没有差别,那么我们来看下性能对比吧。

    func BenchmarkGetAlphanumericNumByASCII(b *testing.B) {for n := 0; n < b.N; n++ {GetAlphanumericNumByASCII("108条梁山man")}}func BenchmarkGetAlphanumericNumByASCIIV2(b *testing.B) {for n := 0; n < b.N; n++ {GetAlphanumericNumByASCIIV2("108条梁山man")}}func BenchmarkGetAlphanumericNumByRegExp(b *testing.B) {for n := 0; n < b.N; n++ {GetAlphanumericNumByRegExp("108条梁山man")}}

    运行上面的基准测试,输出如下:

    go test -bench=. -benchmem main/string

    goos: windows
    goarch: amd64
    pkg: main/string
    cpu: Intel(R) Core(TM) i7-9700 CPU @ 3.00GHz
    BenchmarkGetAlphanumericNumByASCII-8            89540210                12.67 ns/op            0 B/op          0 allocs/op
    BenchmarkGetAlphanumericNumByASCIIV2-8          63227778                19.11 ns/op            0 B/op          0 allocs/op
    BenchmarkGetAlphanumericNumByRegExp-8             465954              2430 ns/op            1907 B/op         27 allocs/op
    PASS
    ok      main/string     3.965s

    不测不知道,一测吓一跳。通过正则表达式的实现方式,代码虽然简洁,但是涉及多次内存配分,性能与 ASCII 码值法相比,差距非常之大,是 ASCII 码值法的 200 倍左右。所以从性能的考虑,推荐使用 ASCII 码值的方式获取数字字母数量。

    ASCII 码值法有两种遍历方式,一种是按照字节遍历,一种是按照 rune 字符遍历。因为后者涉及 rune 字符的判断,所以性能会差一些。推荐使用按照字节遍历。

    4.小结

    本文给出了两种从字符串获取数字与字母数量的方法:

    • ASCII 码值。

    • 正则表达式。

    出于性能的考虑,推荐使用 ASCII 码值法,并使用字节遍历的方式。

    此外,本文给出的两种方法,三种实现方式,相关源码已放置开源库 go-huge-util,可 import 直接使用。

    package mainimport ("fmt"huge "GitHub.com/dablelv/go-huge-util")func main() {fmt.Println(huge.GetAlphanumericNumByASCII("108条梁山man"))  // 6fmt.Println(huge.GetAlphanumericNumByASCIIV2("108条梁山man"))  // 6fmt.Println(huge.GetAlphanumericNumByRegExp("108条梁山man")) // 6}

    以上就是“Golang如何统计字符串中数字字母的数量”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网GO频道。

    您可能感兴趣的文档:

    --结束END--

    本文标题: Golang如何统计字符串中数字字母的数量

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

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

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

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

    下载Word文档
    猜你喜欢
    • Golang如何统计字符串中数字字母的数量
      今天小编给大家分享一下Golang如何统计字符串中数字字母的数量的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.需求说明记...
      99+
      2023-06-30
    • Golang 统计字符串中数字字母数量的实现方法
      目录1.需求说明2.实现2.1 ASCII 码值法2.2 正则表达式3.性能对比4.小结参考文献1.需求说明 记录一下项目对用户 UGC 文本进行字数限制的具体实现。 不同的产品,出...
      99+
      2022-11-13
    • Python----统计字符串中的英文字母、空格、数字和其它字符的个数。
      1、输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 方法一:使用正则表达式 import restr1 = input("请输入一行字符串:")alpha = 0 #英文字母space = 0 #空格digit = ...
      99+
      2023-10-08
      python 正则表达式 开发语言
    • golang字符串如何转数字
      golang字符串转数字有”strconv.Atoi()()函数“、”strconv.ParseFloat()()函数“两种常见方法:1、使用strconv.Atoi()函数可以将字符串转换为整数类型,该函数返回两个值,第一个值是转换后的整...
      99+
      2023-12-18
      go语言 Golang
    • python 统计字符串中字符的个数
      python 统计字符串中字符的个数 1.遍历计数 遍历字符串的每个字符,遍历的时候加入判断是否为字母的条件 isalpha,如果结果为 True 则计数器加1,否则进入下一个循环。 str_= "3...
      99+
      2023-10-02
      python 开发语言 学习
    • python:过滤字符串中的字母数字特殊
      今天遇到的字符串处理的问题,记录一下方便使用   1 str1 = input('请输入一个字符:') 2 #初始化字符、数字、空格、特殊字符的计数 3 lowercase = 0 4 uppercase = 0 5 nu...
      99+
      2023-01-30
      字符串 字母 数字
    • 如何从 MySQL 中的字符串中删除所有非字母数字字符?
      非字母数字字符如下 - @,!,#,&,(),, / MySQL 中没有内置函数可以从字符串中删除非字母数字字符。因此,我们创建一个删除所有非字母数字字符的函数。函数声明和定义如下。 mysql> delimiter // my...
      99+
      2023-10-22
    • php如何统计字符串中不同字符的个数
      这篇文章主要介绍了php如何统计字符串中不同字符的个数的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇php如何统计字符串中不同字符的个数文章都会有所收获,下面我们一起来看看吧。统计方法:1、使用“str_spl...
      99+
      2023-06-29
    • JavaScript如何生成一个随机的数字字母字符串
      这篇文章主要介绍了JavaScript如何生成一个随机的数字字母字符串,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。生成一个随机的数字字母字...
      99+
      2022-10-19
    • java8 统计字符串字母个数的几种方法总结(推荐)
      1.统计字符串字母个数(并且保持字母顺序)比如: aabbbbbbbba喔喔bcab cdabc deaaa目前我做知道的有5种方式噢,如果你还有更好的,欢迎赐教//方式1 public static void letterCount1(...
      99+
      2023-05-30
      java8 统计 字符串
    • 如何统计字符串中每个字符出现的次数
      这篇文章给大家分享的是有关如何统计字符串中每个字符出现的次数的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。统计字符串中每个字符出现的次数的方法:首先创建一个PHP示例文件;然后把出现过的字符记录在array数组中...
      99+
      2023-06-14
    • php如何统计数组中特定字符串的数量
      这篇文章主要讲解了“php如何统计数组中特定字符串的数量”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何统计数组中特定字符串的数量”吧!方法一:使用循环遍历数组并计数这种方法比较基础...
      99+
      2023-07-05
    • php如何测试字母数字字符
      这篇文章将为大家详细讲解有关php如何测试字母数字字符,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。测试字母数字字符您有一个字符串,要测试,如果它仅包含字母数字字符。常规...
      99+
      2022-10-19
    • python技巧 计算字符串中字母出现的
      有一个字符串 “aaddfdfdercfghfyttefsfsfewretr123trefg5624sdfcgvfdgte6435234532”,现在需要取出里面出现次数最多的字符 第一种方法-装饰器 class get_max_coun...
      99+
      2023-01-30
      字符串 字母 技巧
    • 统计一个字符串中相同字符的个数
      作为测试小白,苦练代码基本功,啥时候都不嫌晚。 今天在测试群里,看到小伙伴在面试中有个题目,用一段代码对一个字符串进行统计,分别输出字符与数量!!! 于是用业余时间写了下: #!/usr/bin/env python # -*- co...
      99+
      2023-01-30
      字符串 字符 个数
    • php如何判断一个字符串只含数字和字母
      这篇“php如何判断一个字符串只含数字和字母”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php如何判断一个字符串只含数字和...
      99+
      2023-07-05
    • golang如何使用字符串传递数字
      这篇文章主要为大家展示了“golang如何使用字符串传递数字”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“golang如何使用字符串传递数字”这篇文章吧。用字符...
      99+
      2022-10-19
    • linux如何统计字符串个数
      这篇文章主要介绍了linux如何统计字符串个数,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。统计字符串个数grep -c ...
      99+
      2022-10-19
    • php怎么统计字符串中不同字符的个数
      本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑php统计字符串中不同字符的个数在php中,可以借助数组函数来统计字符串中不同字符的个数。先使用str_split()将字符串转为字符数组使用array_count_v...
      99+
      2016-09-04
      php 字符串 统计字符个数
    • 使用Python统计字符串中各种字符的个数
      Python 统计字符串中各种字符出现的次数一、提出问题随机输入一段字符串,包括数字,英文,空格,其他字符,统计这些字符在其中出现的次数二、难点提示思路:从键盘随机输入一段字符串,然后循环遍历字符串,通过循环字符串中的每一个字符,统计各类字...
      99+
      2023-06-01
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作