gpt4 book ai didi

regex - scala 在捕获组上拆分

转载 作者:行者123 更新时间:2023-12-01 23:45:54 25 4
gpt4 key购买 nike

我试图仅在正则表达式的捕获组上拆分字符串,但我似乎在整个匹配上拆分。

我想拆分hi|my~~|~|name is bob|前面是零或任何偶数的 ~

所以我的预期输出是 Array(hi, my~~, ~|name is bob)

我正在使用正则表达式 "(?<!~)(?:~~)*(\\|)"

但是"hi|my~~|~|name is bob".split("(?<!~)(?:~~)*(\\|)")正在返回 Array[String] = Array(hi, my, ~|name is bob)因为它在整个 ~~| 上 split 在 my 之后而不仅仅是 |前面是 ~~ .

例如比较:

scala> "(?<!~)(?:~~)*(\\|)".r.findAllIn("hi|my~~|~|name is bob").foreach(println)
|
~~|

scala> "(?<!~)(?:~~)*(\\|)".r.findAllIn("hi|my~~|~|name is bob").matchData foreach { m => println(m.group(1)) }
|
|

编辑:

一些背景和说明:

我正在尝试将字符串列表序列化为由 | 分隔的单个字符串.我不能保证 | (或与此相关的任何字符)不会出现在单个字符串中。

为了实现所需的功能,我想转义所有出现的 | .我选择了 ~作为我的逃脱角色。在我逃跑之前|我需要逃离 ~ .

一旦我转义了所有内容,我就可以使用 | 加入列表获取表示我的原始字符串列表的单个字符串。

然后为了将单个字符串解析回原始列表,我只需要在未转义的 | 上拆分的。我必须小心,因为类似 ~~| 的东西实际上是一个未转义的管道,即使它包含 ~| .这是因为转义字符本身是转义的,这意味着它只是我原始字符串之一中的“波浪线”,并不意味着用作“转义”。换句话说,我有一个以 ~ 结尾的字符串, 现在转义到 ~~并通过“|”与列表中的下一个字符串连接。

好的,如果我的初始字符串列表是 ["hi","my~","|name is bob"]我先转义所有~得到["hi","my~~","|name is bob"] .现在我将转义所有|得到["hi","my~~","~|name is bob"] ,最后我将加入 |获取单个字符串:

"hi|my~~|~|name is bob"

现在,如果我想扭转这一局面,我需要首先拆分未转义的 |的,这是任何 |前面有零个或偶数个 ~的。所以如果我可以用我的正则表达式实现这个(到目前为止我在我的捕获组中正确捕获它,但我只是不知道如何只应用组而不是完整的 ~~| 匹配例如拆分),然后我会得到 ["hi","my~~","~|name is bob"] .现在我只是取消了我的 ~的,取消转义我的 | ,我回到了我最初的输入:

["hi","my~","|name is bob"]

最佳答案

您需要所有 ~ 都成为后视组的一部分,因为 split 在正则表达式的 whole 匹配上拆分,不只是其中的一组,即使该组是非捕获组。一个更简单的例子:

"asdf" split "(?:s)" //Array(a, df)

look-behind 组不是匹配的一部分,所以你想把你的前缀标准放在那里。基本上,您需要将您的解决方案包装在另一个后视组中。理想情况下,您希望:

"""(?<=(?<!~)(~~)*)\|"""

但不幸的是,Java 不支持任意长度的后视组。作为解决方法,您可以执行以下操作:

"""(?<=(?<!~)(~~){0,10})\|"""

只要 ~ 的个数不超过 20 个,它就适用于偶数个 ~。如果这是一个问题,您可以增加 10。

如果嵌套的回顾令人困惑,您也可以使用等效的:

"""(?<![^~]~(~~){0,10})\|"""

关于regex - scala 在捕获组上拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29265315/

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