golang 正则匹配(更详细易懂 语法+示例)

这篇具有很好参考价值的文章主要介绍了golang 正则匹配(更详细易懂 语法+示例)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. Golang中的正则语法

1.1 用法

------------------------------ 
单一:
        .                   匹配任意一个字符,如果设置 s = true,则可以匹配换行符

        [字符类]            匹配“字符类”中的一个字符,“字符类”见后面的说明
        [^字符类]           匹配“字符类”外的一个字符,“字符类”见后面的说明

        \小写Perl标记       匹配“Perl类”中的一个字符,“Perl类”见后面的说明
        \大写Perl标记       匹配“Perl类”外的一个字符,“Perl类”见后面的说明

        [:ASCII类名:]       匹配“ASCII类”中的一个字符,“ASCII类”见后面的说明
        [:^ASCII类名:]      匹配“ASCII类”外的一个字符,“ASCII类”见后面的说明

        \pUnicode普通类名   匹配“Unicode类”中的一个字符(仅普通类),“Unicode类”见后面的说明
        \PUnicode普通类名   匹配“Unicode类”外的一个字符(仅普通类),“Unicode类”见后面的说明

        \p{Unicode类名}     匹配“Unicode类”中的一个字符,“Unicode类”见后面的说明
        \P{Unicode类名}     匹配“Unicode类”外的一个字符,“Unicode类”见后面的说明

------------------------------
复合:
        xy             匹配 xy(x 后面跟随 y)
        x|y            匹配 x 或 y (优先匹配 x)

------------------------------
重复:
        x*             匹配零个或多个 x,优先匹配更多(贪婪)
        x+             匹配一个或多个 x,优先匹配更多(贪婪)
        x?             匹配零个或一个 x,优先匹配一个(贪婪)
        x{n,m}         匹配 n 到 m 个 x,优先匹配更多(贪婪)
        x{n,}          匹配 n 个或多个 x,优先匹配更多(贪婪)
        x{n}           只匹配 n 个 x
        x*?            匹配零个或多个 x,优先匹配更少(非贪婪)
        x+?            匹配一个或多个 x,优先匹配更少(非贪婪)
        x??            匹配零个或一个 x,优先匹配零个(非贪婪)
        x{n,m}?        匹配 n 到 m 个 x,优先匹配更少(非贪婪)
        x{n,}?         匹配 n 个或多个 x,优先匹配更少(非贪婪)
        x{n}?          只匹配 n 个 x

------------------------------
分组:
        (子表达式)            被捕获的组,该组被编号 (子匹配)
        (?P<命名>子表达式)    被捕获的组,该组被编号且被命名 (子匹配)
        (?:子表达式)          非捕获的组 (子匹配)
        (?标记)               在组内设置标记,非捕获,标记影响当前组后的正则表达式
        (?标记:子表达式)      在组内设置标记,非捕获,标记影响当前组内的子表达式

        标记的语法是:
        xyz  (设置 xyz 标记)
        -xyz (清除 xyz 标记)
        xy-z (设置 xy 标记, 清除 z 标记)

        可以设置的标记有:
        i              不区分大小写 (默认为 false)
        m              多行模式:让 ^ 和 $ 匹配整个文本的开头和结尾,而非行首和行尾(默认为 false)
        s              让 . 匹配 \n (默认为 false)
        U              非贪婪模式:交换 x* 和 x*? 等的含义 (默认为 false)

------------------------------
位置标记:
        ^              如果标记 m=true 则匹配行首,否则匹配整个文本的开头(m 默认为 false)
        $              如果标记 m=true 则匹配行尾,否则匹配整个文本的结尾(m 默认为 false)
        \A             匹配整个文本的开头,忽略 m 标记
        \b             匹配单词边界
        \B             匹配非单词边界
        \z             匹配整个文本的结尾,忽略 m 标记

------------------------------
转义序列:
        \a             匹配响铃符    (相当于 \x07)
                       注意:正则表达式中不能使用 \b 匹配退格符,因为 \b 被用来匹配单词边界,
                       可以使用 \x08 表示退格符。
        \f             匹配换页符    (相当于 \x0C)
        \t             匹配横向制表符(相当于 \x09)
        \n             匹配换行符    (相当于 \x0A)
        \r             匹配回车符    (相当于 \x0D)
        \v             匹配纵向制表符(相当于 \x0B)
        \123           匹配 8  進制编码所代表的字符(必须是 3 位数字)
        \x7F           匹配 16 進制编码所代表的字符(必须是 3 位数字)
        \x{10FFFF}     匹配 16 進制编码所代表的字符(最大值 10FFFF  )
        \Q...\E        匹配 \Q 和 \E 之间的文本,忽略文本中的正则语法

        \\             匹配字符 \
        \^             匹配字符 ^
        \$             匹配字符 $
        \.             匹配字符 .
        \*             匹配字符 *
        \+             匹配字符 +
        \?             匹配字符 ?
        \{             匹配字符 {
        \}             匹配字符 }
        \(             匹配字符 (
        \)             匹配字符 )
        \[             匹配字符 [
        \]             匹配字符 ]
        \|             匹配字符 |

------------------------------
可以将“命名字符类”作为“字符类”的元素:
        [\d]           匹配数字 (相当于 \d)
        [^\d]          匹配非数字 (相当于 \D)
        [\D]           匹配非数字 (相当于 \D)
        [^\D]          匹配数字 (相当于 \d)
        [[:name:]]     命名的“ASCII 类”包含在“字符类”中 (相当于 [:name:])
        [^[:name:]]    命名的“ASCII 类”不包含在“字符类”中 (相当于 [:^name:])
        [\p{Name}]     命名的“Unicode 类”包含在“字符类”中 (相当于 \p{Name})
        [^\p{Name}]    命名的“Unicode 类”不包含在“字符类”中 (相当于 \P{Name})

1.2 说明

------------------------------
“字符类”取值如下(“字符类”包含“Perl类”、“ASCII类”、“Unicode类”):
    x                    单个字符
    A-Z                  字符范围(包含首尾字符)
    \小写字母            Perl类
    [:ASCII类名:]        ASCII类
    \p{Unicode脚本类名}  Unicode类 (脚本类)
    \pUnicode普通类名    Unicode类 (普通类)

------------------------------
“Perl 类”取值如下:
    \d             数字 (相当于 [0-9])
    \D             非数字 (相当于 [^0-9])
    \s             空白 (相当于 [\t\n\f\r ])
    \S             非空白 (相当于[^\t\n\f\r ])
    \w             单词字符 (相当于 [0-9A-Za-z_])
    \W             非单词字符 (相当于 [^0-9A-Za-z_])

------------------------------
“ASCII 类”取值如下
    [:alnum:]      字母数字 (相当于 [0-9A-Za-z])
    [:alpha:]      字母 (相当于 [A-Za-z])
    [:ascii:]      ASCII 字符集 (相当于 [\x00-\x7F])
    [:blank:]      空白占位符 (相当于 [\t ])
    [:cntrl:]      控制字符 (相当于 [\x00-\x1F\x7F])
    [:digit:]      数字 (相当于 [0-9])
    [:graph:]      图形字符 (相当于 [!-~])
    [:lower:]      小写字母 (相当于 [a-z])
    [:print:]      可打印字符 (相当于 [ -~] 相当于 [ [:graph:]])
    [:punct:]      标点符号 (相当于 [!-/:-@[-反引号{-~])
    [:space:]      空白字符(相当于 [\t\n\v\f\r ])
    [:upper:]      大写字母(相当于 [A-Z])
    [:word:]       单词字符(相当于 [0-9A-Za-z_])
    [:xdigit:]     16 進制字符集(相当于 [0-9A-Fa-f])

------------------------------
“Unicode 类”取值如下---普通类:
    C                 -其他-          (other)
    Cc                控制字符        (control)
    Cf                格式            (format)
    Co                私人使用区      (private use)
    Cs                代理区          (surrogate)
    L                 -字母-          (letter)
    Ll                小写字母        (lowercase letter)
    Lm                修饰字母        (modifier letter)
    Lo                其它字母        (other letter)
    Lt                首字母大写字母  (titlecase letter)
    Lu                大写字母        (uppercase letter)
    M                 -标记-          (mark)
    Mc                间距标记        (spacing mark)
    Me                关闭标记        (enclosing mark)
    Mn                非间距标记      (non-spacing mark)
    N                 -数字-          (number)
    Nd                十進制数字      (decimal number)
    Nl                字母数字        (letter number)
    No                其它数字        (other number)
    P                 -标点-          (punctuation)
    Pc                连接符标点      (connector punctuation)
    Pd                破折号标点符号  (dash punctuation)
    Pe                关闭的标点符号  (close punctuation)
    Pf                最后的标点符号  (final punctuation)
    Pi                最初的标点符号  (initial punctuation)
    Po                其他标点符号    (other punctuation)
    Ps                开放的标点符号  (open punctuation)
    S                 -符号-          (symbol)
    Sc                货币符号        (currency symbol)
    Sk                修饰符号        (modifier symbol)
    Sm                数学符号        (math symbol)
    So                其他符号        (other symbol)
    Z                 -分隔符-        (separator)
    Zl                行分隔符        (line separator)
    Zp                段落分隔符      (paragraph separator)
    Zs                空白分隔符      (space separator)

------------------------------
“Unicode 类”取值如下---脚本类:
    Arabic                  阿拉伯文
    Armenian                亚美尼亚文
    Balinese                巴厘岛文
    Bengali                 孟加拉文
    Bopomofo                汉语拼音字母
    Braille                 盲文
    Buginese                布吉文
    Buhid                   布希德文
    Canadian_Aboriginal     加拿大土著文
    Carian                  卡里亚文
    Cham                    占族文
    Cherokee                切诺基文
    Common                  普通的,字符不是特定于一个脚本
    Coptic                  科普特文
    Cuneiform               楔形文字
    Cypriot                 塞浦路斯文
    Cyrillic                斯拉夫文
    Deseret                 犹他州文
    Devanagari              梵文
    Ethiopic                衣索比亚文
    Georgian                格鲁吉亚文
    Glagolitic              格拉哥里文
    Gothic                  哥特文
    Greek                   希腊
    Gujarati                古吉拉特文
    Gurmukhi                果鲁穆奇文
    Han                     汉文
    Hangul                  韩文
    Hanunoo                 哈鲁喏文
    Hebrew                  希伯来文
    Hiragana                平假名(日语)
    Inherited               继承前一个字符的脚本
    Kannada                 坎那达文
    Katakana                片假名(日语)
    Kayah_Li                克耶字母
    Kharoshthi              卡罗须提文
    Khmer                   高棉文
    Lao                     老挝文
    Latin                   拉丁文
    Lepcha                  雷布查文
    Limbu                   林布文
    Linear_B                B类线形文字(古希腊)
    Lycian                  利西亚文
    Lydian                  吕底亚文
    Malayalam               马拉雅拉姆文
    Mongolian               蒙古文
    Myanmar                 缅甸文
    New_Tai_Lue             新傣仂文
    Nko                     Nko文
    Ogham                   欧甘文
    Ol_Chiki                桑塔利文
    Old_Italic              古意大利文
    Old_Persian             古波斯文
    Oriya                   奥里亚文
    Osmanya                 奥斯曼亚文
    Phags_Pa                八思巴文
    Phoenician              腓尼基文
    Rejang                  拉让文
    Runic                   古代北欧文字
    Saurashtra              索拉什特拉文(印度县城)
    Shavian                 萧伯纳文
    Sinhala                 僧伽罗文
    Sundanese               巽他文
    Syloti_Nagri            锡尔赫特文
    Syriac                  叙利亚文
    Tagalog                 塔加拉文
    Tagbanwa                塔格巴努亚文
    Tai_Le                  德宏傣文
    Tamil                   泰米尔文
    Telugu                  泰卢固文
    Thaana                  塔安那文
    Thai                    泰文
    Tibetan                 藏文
    Tifinagh                提非纳文
    Ugaritic                乌加里特文
    Vai                     瓦伊文
    Yi                      彝文

1.3 注意

    对于 [a-z] 这样的正则表达式,如果要在 [] 中匹配 - ,可以将 - 放在 [] 的开头或结尾,例如 [-a-z] 或 [a-z-]

  可以在 [] 中使用转义字符:\f、\t、\n、\r、\v、\377、\xFF、\x{10FFFF}、\\、\^、\$、\.、\*、\+、\?、\{、\}、\(、\)、\[、\]、\|(具体含义见上面的说明)

  如果在正则表达式中使用了分组,则在执行正则替换的时候,“替换内容”中可以使用 $1、${1}、$name、${name} 这样的“分组引用符”获取相应的分组内容。其中 $0 代表整个匹配项,$1 代表第 1 个分组,$2 代表第 2 个分组,……。

  如果“分组引用符”是 $name 的形式,则在解析的时候,name 是取尽可能长的字符串,比如:$1x 相当于 ${1x},而不是${1}x,再比如:$10 相当于 ${10},而不是 ${1}0。

  由于 $ 字符会被转义,所以要在“替换内容”中使用 $ 字符,可以用 \$ 代替。

  上面介绍的正则表达式语法是“Perl 语法”,除了“Perl 语法”外,Go 语言中还有另一种“POSIX 语法”,“POSIX 语法”除了不能使用“Perl 类”之外,其它都一样。

2. Golang中正则表达示例

package main

import (
    "fmt"
    "regexp"
)

func main() {
    text := `Hello 世界!123 Go.`
    reg := regexp.MustCompile(`[a-z]+`)             // 查找连续的小写字母
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // 输出结果["ello" "o"]

    reg = regexp.MustCompile(`[^a-z]+`)             // 查找连续的非小写字母
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["H" " 世界!123 G" "."]

    reg = regexp.MustCompile(`[\w]+`)               // 查找连续的单词字母
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" "123" "Go"]

    reg = regexp.MustCompile(`[^\w\s]+`)            // 查找连续的非单词字母、非空白字符
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["世界!" "."]

    reg = regexp.MustCompile(`[[:upper:]]+`)        // 查找连续的大写字母
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["H" "G"]

    reg = regexp.MustCompile(`[[:^ascii:]]+`)       // 查找连续的非 ASCII 字符
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["世界!"]

    reg = regexp.MustCompile(`[\pP]+`)              // 查找连续的标点符号
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["!" "."]

    reg = regexp.MustCompile(`[\PP]+`)              // 查找连续的非标点符号字符
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello 世界" "123 Go"]

    reg = regexp.MustCompile(`[\p{Han}]+`)          // 查找连续的汉字
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["世界"]

    reg = regexp.MustCompile(`[\P{Han}]+`)          // 查找连续的非汉字字符
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello " "!123 Go."]

    reg = regexp.MustCompile(`Hello|Go`)            // 查找 Hello 或 Go
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" "Go"]

    reg = regexp.MustCompile(`^H.*\s`)              // 查找行首以 H 开头,以空格结尾的字符串
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello 世界!123 "]

    reg = regexp.MustCompile(`(?U)^H.*\s`)          // 查找行首以 H 开头,以空白结尾的字符串(非贪婪模式)
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello "]

    reg = regexp.MustCompile(`(?i:^hello).*Go`)     // 查找以 hello 开头(忽略大小写),以 Go 结尾的字符串
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello 世界!123 Go"]

    reg = regexp.MustCompile(`\QGo.\E`)             // 查找 Go.
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Go."]

    reg = regexp.MustCompile(`(?U)^.* `)            // 查找从行首开始,以空格结尾的字符串(非贪婪模式)
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello "]

    reg = regexp.MustCompile(` [^ ]*$`)             // 查找以空格开头,到行尾结束,中间不包含空格字符串
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // [" Go."]

    reg = regexp.MustCompile(`(?U)\b.+\b`)          // 查找“单词边界”之间的字符串
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" " 世界!" "123" " " "Go"]

    reg = regexp.MustCompile(`[^ ]{1,4}o`)          // 查找连续 1 次到 4 次的非空格字符,并以 o 结尾的字符串
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" "Go"]

    reg = regexp.MustCompile(`(?:Hell|G)o`)         // 查找 Hello 或 Go
    fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" "Go"]

    reg = regexp.MustCompile(`(?PHell|G)o`)                   // 查找 Hello 或 Go,替换为 Hellooo、Gooo
    fmt.Printf("%q\n", reg.ReplaceAllString(text, "${n}ooo")) // "Hellooo 世界!123 Gooo."

    reg = regexp.MustCompile(`(Hello)(.*)(Go)`)              // 交换 Hello 和 Go
    fmt.Printf("%q\n", reg.ReplaceAllString(text, "$3$2$1")) // "Go 世界!123 Hello."

    reg = regexp.MustCompile(`[\f\t\n\r\v\123\x7F\x{10FFFF}\\\^\$\.\*\+\?\{\}

\|]`)
    fmt.Printf("%q\n", reg.ReplaceAllString("\f\t\n\r\v\123\x7F\U0010FFFF\\^$.*+?{}()[]|", "-"))
    // "----------------------"
}文章来源地址https://www.toymoban.com/news/detail-536978.html

到了这里,关于golang 正则匹配(更详细易懂 语法+示例)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【100天精通python】Day23:正则表达式,基本语法与re模块详解示例

      目录  专栏导读  1 正则表达式概述 2 正则表达式语法 2.1 正则表达式语法元素

    2024年02月14日
    浏览(42)
  • 【JaveWeb教程】(17) MySQL数据库开发之 MySQL简介、安装、数据类型、SQL通用语法 详细代码示例讲解

    在我们讲解SpringBootWeb基础知识(请求响应案例)的时候,我们讲到在web开发中,为了应用程序职责单一,方便维护,我们一般将web应用程序分为三层,即:Controller、Service、Dao 。 之前我们的案例中,是这样子的请求流程:浏览器发起请求,先请求Controller;Controller接收到请求之

    2024年01月25日
    浏览(48)
  • 【Python从入门到人工智能】16个必会的Python内置函数(5)——数据转换与计算(详细语法参考 + 参数说明 + 具体示例)

      你的思绪就像这池水,朋友,稍有外界触动就很难清澈明朗,可如果让它静下来,答案顿时变得清晰了。   🎯 作者主页 : 追光者♂ 🔥          🌸 个人简介 : 计算机专业硕士研究生 💖、 2022年CSDN博客之星人工智能领域TOP4 🌟、 阿里云社区特邀专家博主 🏅、 C

    2023年04月13日
    浏览(42)
  • 通俗易懂玩QT:正则表达式 QRegularExpression 学习

    在 Qt 中有两种和正则相关的类,一种是 QRegExp 类,今天查资料说的好像是从 Qt4 传承下来的,BUG 相对来说比较多,目前基本已停止维护了,多用于正则匹配,还有一种就是今天要讲的 QRegularExpression 类,是 Qt5 新开辟出来的类,相对来说比较完善(网上这样说的,具体有待考

    2024年02月02日
    浏览(21)
  • 【正则表达式】正则表达式常见匹配模式

    模式 描述 w 匹配字母数字及下划线 W 匹配非字母数字下划线 s 匹配任意空白字符,等价于 [tnrf]. S 匹配任意非空字符 d 匹配任意数字,等价于 [0-9] D 匹配任意非数字 A 匹配字符串开始 Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 z 匹配字符串结

    2024年02月09日
    浏览(65)
  • 【动态规划】通配符匹配与正则表达式匹配

    题目描述: 给你一个输入字符串 (s) 和一个字符模式 § ,请你实现一个支持 ‘?’ 和 ‘*’ 匹配规则的通配符匹配: ‘?’ 可以匹配任何单个字符。 ‘*’ 可以匹配任意字符序列(包括空字符序列)。 判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而

    2024年02月07日
    浏览(46)
  • NotePad++ 正则匹配文件路径

    CTRL+H - 标记 - 输入上面正则匹配,勾选如下,点全部标记后,会自动匹配文件路径,再点复制标记文本即可。

    2024年02月12日
    浏览(44)
  • Java 正则匹配sql

    在线正则校验 加^$的话就代表把整个要匹配的字符串当成一个整体做一次匹配, 而不加则一个字符串可以匹配多次,代表这个字符串中有符合条件的 如\\\"^abc$\\\"只能匹配abc;\\\"abc\\\"不仅可以匹配abc,还可以匹配abcd

    2024年02月22日
    浏览(27)
  • Notepad++正则匹配

    符号 含义 . 代表除换行符外的任意字符 * 代表匹配零次或者多次 + 表示匹配一次到多次 ? 其左边的字符被匹配0次或者1次 () 影响表达式匹配的顺序(类似C++的小括号会影响表达式运算顺序),并且用作表达式的分组标记(标记从1开始)如:([a-z]bc)smn1匹配“tbcsmntbc” {} 指定前面

    2024年02月11日
    浏览(27)
  • Java 正则表达式匹配

    正则表达式: 定义一个搜索模式的字符串。 正则表达式可以用于搜索、编辑和操作文本。 正则对文本的分析或修改过程为:首先正则表达式应用的是文本字符串(text/string),它会以定义的模式从左到右匹配文本,每个源字符只匹配一次。 正则表达式 匹配 this is text 精确匹配

    2024年02月06日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包