gpt4 book ai didi

匹配 1 次或 2 次出现的正则表达式

转载 作者:行者123 更新时间:2023-12-02 20:05:05 25 4
gpt4 key购买 nike

我的文本结构如下:

book_name:SoftwareEngineering;author:John;author:Smith; book_name:DesignPatterns;author:Foo;author:Bar;

元素分隔符是 ;

两个 author 元素可以跟在 book_name 元素之后

可能有 2 到 10 本书

一本书应该至少有一位作者,但最多有 2 位作者

我想为每本书提取 book_name 和个人作者。

我尝试使用 .scan 方法(收集所有匹配项)的正则表达式:

iex> regex = ~r/book_name:(.+?;)(author:.+?;){1,2}/
iex> text = "book_name:SoftwareEngineering;author:John;author:Smith;book_name:DesignPatterns;author:Foo;author:Bar;"

iex> Regex.scan(regex, text, capture: :all_but_first)
[["SoftwareEngineering;", "author:Smith;"], ["DesignPatterns;", "author:Bar;"]]

但它没有正确收集作者。它仅收集该书的第二作者。有人可以帮忙解决这个问题吗?

最佳答案

模式的这部分 (author:.+?;){1,2} 重复 1-2 次 author 包括后面的分号但重复像这样的捕获组只会给你最后一个捕获组。 This page可能会有帮助。

不使用非贪婪量词 .*?,您可以不匹配分号,重复不匹配分号的否定字符类 [^;]+

您还可以使用捕获组和 author 的反向引用。书名在捕获组 1 中,第一作者的名字在组 3 中,可选的第二作者在组 4 中。

book_name:([^;]+);(author):([^;]+);(?:\2:([^;]+);)?

那将匹配

  • book_name:字面匹配
  • ([^;]+); 第1组匹配不; 然后匹配;
  • (author): 第 2 组 author
  • ([^;]+);第3组匹配不;则匹配;
  • (?: 非捕获组
    • \2: 反向引用第 2 组中捕获的内容
    • ([^;]+);第4组匹配不;则匹配;
  • )? 关闭非捕获组并使其可选

regex101 demo

关于匹配 1 次或 2 次出现的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54974721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com