🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

1. 创建正则表达式

2. 常用函数

3. 捕获组

4. 常用模式与标志

5. 高级特性与技巧

总结


img

在 Julia 中,正则表达式​ 用于强大的文本模式匹配、搜索和替换。其语法与 Perl 兼容,并通过 PCRE库实现。

1. 创建正则表达式

使用以 r开头的字符串字面量,后跟分隔符(通常为 ")。

# 基本创建
regex = r"ab+c"        # 匹配 "abbbc", "abc" 等
# 使用其他分隔符(当模式包含引号时很有用)
regex2 = r/foo"bar/    # 匹配字符串: foo"bar

重要:Julia 字符串和正则表达式都使用反斜杠 ``作为转义字符。要在正则表达式中使用一个字面意义上的反斜杠,必须在字符串字面量中写两个反斜杠:

# 匹配一个数字后跟一个字面意义上的点
# 正确:在正则模式中,\d 匹配数字,\. 匹配点号
# 在 Julia 字符串中,我们需要用 "\\" 来表示一个字面意义上的 "\"
regex = r"\d+\.[0-9]+"   # 例如匹配 "123.456"

# 错误示例:这会被 Julia 解析为字符串的转义序列
# r”\d+.[0-9]+"  # 这里的 \d 在成为正则之前就已经被 Julia 字符串解析了,会导致错误或意外行为

2. 常用函数

  • occursin(r::Regex, s::String):检查字符串 s中是否存在匹配正则 r的部分。返回 truefalse

    occursin(r"\d+", "Room 101")  # true
    occursin(r"^Start", "In the Start") # false (因为 '^' 表示开头,而字符串开头是 "In ")
  • match(r::Regex, s::String):在字符串 s中搜索正则 r第一个匹配。返回一个 RegexMatch对象(若匹配成功)或 nothing

    m = match(r"\d+", "The price is 99 dollars.")
    if m !== nothing
        println(m.match)  # 输出整个匹配项: "99"
        println(m.offset) # 输出匹配开始的索引: 13
    end
  • eachmatch(r::Regex, s::String):返回一个迭代器,用于遍历字符串 s中所有非重叠的匹配。

    for m in eachmatch(r"\w+", "Hello, Julia world!")
        println(m.match)
    end
    # 输出:
    # Hello
    # Julia
    # world
  • replace(s::String, r::Regex => new):将字符串 s中所有匹配正则 r的部分替换为 newnew可以是一个字符串或函数。

    replace("foo 123 bar", r"\d+" => "NUM")  # "foo NUM bar"
    # 使用函数进行动态替换
    replace("a1 b2 c3", r"\d" => x -> string(parse(Int, x.match) + 1))  # "a2 b3 c4"

3. 捕获组

使用圆括号 ()在正则表达式中定义捕获组。匹配后可以从 RegexMatch对象中提取它们。

m = match(r"(\w+)\s+(\d+)", "Alice 30 years old")
if m !== nothing
    println(m.match)       # 整个匹配: "Alice 30"
    println(m[1])          # 第一个捕获组: "Alice"
    println(m[2])          # 第二个捕获组: "30"
    println(m.captures)    # 所有捕获组的数组: ["Alice", "30"]
end

replace中,可以在替换字符串中使用 \g<1>, \g<2>等来引用捕获组。

replace("2025-12-31", r"(\d{4})-(\d{2})-(\d{2})" => s"\g<3>/\g<2>/\g<1>")  # "31/12/2025"

4. 常用模式与标志

  • 元字符

    • .: 匹配任何字符(默认不包括换行符)。

    • ^: 匹配字符串开头。

    • $: 匹配字符串结尾。

    • *: 前一个元素零次或多次。

    • +: 前一个元素一次或多次。

    • ?: 前一个元素零次或一次。

    • |: 或操作。

    • [...]: 字符类,匹配括号内的任意一个字符。[a-z]表示小写字母。

    • [^...]: 否定字符类,匹配不在括号内的任意一个字符。

  • 预定义字符类

    • \d: 数字,等价于 [0-9]

    • \s: 空白字符(空格、制表符等)。

    • \w: 单词字符(字母、数字、下划线),等价于 [A-Za-z0-9_]

    • 其大写形式表示否定:\D非数字,\S非空白,\W非单词字符。

  • 修饰符(标志): 在正则表达式字符串的末尾添加,用于改变匹配行为。

    r"abc"i    # `i` 表示忽略大小写
    r"^a.*z$"s # `s` 表示让 `.` 匹配包括换行符在内的所有字符
    r"^foo"m   # `m` 表示多行模式,使 `^` 和 `$` 能匹配每行的开头和结尾

5. 高级特性与技巧

  • 非捕获组:使用 (?:...)进行分组但不捕获。

  • 环视(?=...)正前瞻,(?!...)负前瞻,(?<=...)正回顾后顾,(?<!...)负回顾后顾。

  • Unicode 支持:Julia 正则表达式完全支持 Unicode。你可以使用像 \p{L}这样的 Unicode 属性来匹配字母。

  • 性能:编译正则表达式(r"...")会产生开销。如果要在循环中重复使用同一个模式,应在循环外将其定义为常量。

总结

Julia 的正则表达式功能全面且强大。核心是使用 r"..."字面量定义模式,配合 occursin, match, eachmatch, replace等函数进行操作。牢记 Julia 字符串的双反斜杠转义规则,并善用捕获组和标志,可以高效地处理复杂的文本匹配与替换任务。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐