【问题标题】:How to use lookahead and lookbehind in more than one capturing group如何在多个捕获组中使用前瞻和后瞻
【发布时间】:2019-07-26 21:52:53
【问题描述】:

我正在尝试使用正向前瞻和后向来提取括号之间的数据,并且我需要使用与括号数相同数量的捕获组。我面临的问题是,当我尝试使用多个捕获组时,没有匹配项,但如果我只使用一个组,那么它工作正常。我必须对我的正则表达式进行哪些更改才能使其匹配适当的数据。我与数据一起使用的正则表达式是here。我想在 AWS Athena 中使用它来从我的 S3 存储桶对象中读取数据。

我已经尝试了各种其他方法,但最终选择了前瞻和后瞻这种方法,因为它可以确保不捕获括号。

((?<=VERS\=\()[^\)]*(?=\)))((?<=UUID\=\()[^\)]*(?=\)))

预期结果是第一个捕获组从第一个括号中捕获数据,第二个组从第二个括号中捕获数据。

【问题讨论】:

    标签: regex regex-group


    【解决方案1】:

    如果您想匹配其中任何一个,您可以添加一个管道 |,这意味着两个部分之间的交替,并在捕获组之外进行环视。

    请注意,您不必在字符类中转义 =)

    (?<=VERS=\()([^)]*)(?=\))|(?<=UUID=\()([^)]*)(?=\))
                             ^   
    

    Regex demo

    您也可以匹配这两个部分,而不是使用环视:

    VERS=\(([^)]+)\);UUID=\(([^)]+)\);
    

    Regex demo

    【讨论】:

    • 在不使用环视的情况下执行正则表达式的第二个选项中,如果其中一个字段并不总是存在,我将如何继续,比如 UUID 是可选的。
    • @ChanduRaman 如果第二个是可选的,您可以使用可选组regex101.com/r/T0OtzI/1
    • 此外,我在使用 regex ser de 的 AWS Athena 中进行了尝试,但由于某种原因,所有列的值都变为 null。您对造成这种情况的原因有任何想法吗?并且管道功能在 AThena 中也不起作用
    • @ChanduRaman 您是否尝试过双重转义反斜杠? String regex = "VERS=\\(([^)]+)\\);UUID=\\(([^)]+)\\);"; 当我读到this page 的开头是if a row does not match the regex, then all columns in the row will be NULL 你确定有匹配吗?
    • 我使用了双转义反斜杠,因为没有它我会得到一个不同的错误。当他们说一行需要匹配时,我并不是他们的确切意思,因为我的数据行有 14 个参数,其中 10 个参数确实匹配,其余列名不存在于数据本身中,因为我按照你的建议使用了可选的捕获。
    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 2023-02-07
    • 1970-01-01
    • 2011-02-27
    相关资源
    最近更新 更多