【问题标题】:How to split a string using a lookahead assertion with changing delimiters如何使用带有更改分隔符的前瞻断言来拆分字符串
【发布时间】:2014-11-26 19:23:55
【问题描述】:

鉴于我的英语最近真的很生疏,我会简短地说。 我想要做的是将一个字符串拆分为一组子字符串,将分隔符作为各个子字符串的一部分。当然,如果不是因为分隔符可能会有所不同,这也不是什么难事。假设我有一个类似于:

[ffd][ulg][zff] = 1 = ... = 2 = ... [bdt] = 3 = ... [abc][dfg][urc][ttr] = 4 = .. .

我想将其拆分为以下子字符串:

[ffd][ulg][zff] = 1 = ...

= 2 = ...

[bdt] = 3 = ...

[abc][dfg][urc][ttr] = 4 = ...

请注意,“= number =”序列必须始终存在(并且是基本分隔符),但它可能(或可能不)前面有不同数量的 \[\w{3}\] 组.

到目前为止,我已经玩弄了以下表达式:

?=((\[\w{3}\])+\s= \d\{3} =)

?=((\[\w{3}\])*\s= \d\{3} =)

第一个返回:[ffd], [uld], [zff] = 1 = ..., [bdt] = 3 =, [abc], [dfg], [urc], [ttr] = 4 = 。 ..作为单独的字符串。不出所料,它在将 [\w{3}] 簇视为一个簇并将“= 2 = ...”解释为“[zff] = 1 = ...”子字符串的一部分时存在问题。另一个简单地将每个 [\w{3}] 和每个“= number = ...”序列解释为单独的字符串。此外,我尝试将 OR 子句嵌入为 split 方法的参数,即:

(?=((\[\w{3}\])+\s= \d\{3} =|= \d\{3} =))

但效果和第二种情况一样。

【问题讨论】:

  • 好的,你试过什么?到目前为止,您的代码/正则表达式有什么问题?
  • ... 是实际内容还是更多[asd][cxg]的占位符?
  • @zapl 省略号代表任何给定的文本内容

标签: java regex split lookahead


【解决方案1】:

您是否尝试使用后向断言进行拆分?:

(?<== [0-9]{1,1000} =)

或使用 find :

\\[.*?(?:= [0-9]+ =|$)

【讨论】:

  • 后视必须是固定长度。在代码/测试器中试试你的外观
  • @Bohemian:不,在 Java 中,如果长度有限,您可以使用可变长度的lookbehinds。你可以试试 regexplanet.com
  • @CasimiretHippolyte 恐怕lookbehinds 无法解决问题。他们返回前面提到的子字符串,其中分隔符被剪掉了。至于查找,它返回: [ffd][ulg][zff] = 1 = ... , [bdt] = 3 = ... 和 [abc][dfg][urc][ttr] = 4 = 。 .. 应该如此,所以你已经接近了,但它未能捕捉到前所未有的“= number =”子句。
  • @AstragalFrigide: 它确实没有找到“unpreceded number 从句”,但这并不重要,因为在这种情况下该项目只能是第一项,在这种情况下,拆分方法将执行通过将其与其他工作分开。
  • @AstragalFrigide:你的问题是...字面意思...吗?如果这个答案是否定的,... 的最大长度是多少?
猜你喜欢
  • 2019-04-22
  • 2023-03-11
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多