gpt4 book ai didi

java - 使用 Java 和 Regex 拆分复杂的字符串

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:18:17 26 4
gpt4 key购买 nike

使用 Java 和正则表达式,我想从一行文本中提取字符串。文本可以采用以下格式 -

  1. 键1(值1)键2(值2)
  2. 键1(值1)键2
  3. key1 key2(value2)
  4. key1 key2
  5. 键1

当使用类型 #1 时,我可以成功提取键和值,我可以使用空格拆分文本,然后使用以下模式提取键

Pattern p = Pattern.compile("\\((.*?)\\)",Pattern.DOTALL);

用于计算“(”的出现并将其与出现的匹配的复杂代码逻辑该空间可用于案例 #2 和案例 #3,但是,代码变得太长了。当值中也存在空格时会出现多种复杂情况,因为那样的话,拆分文本就会出现问题。

是否有更好的正则表达式拆分/隐藏可用于上述选择性案例?

最佳答案

考虑以下通用正则表达式的 powershell 示例。

(?<=^|[\s)\n])[\n]*([^(\n\s]*)([(]([^)\n]*)[)])?

例子

    $Matches = @()
$String = 'key1(value1) key2(value2)
key3(value3) key3.5
key4 key5(value5) GoofyStuff(I like kittens)
key6 key7 ForReal-Things(be sure to vote)
key8'
Write-Host start with
write-host $String
Write-Host
Write-Host found
([regex]'(?<=^|[\s)\n])([^(\n\s]*)([(]([^)\n]*)[)])?').matches($String) | foreach {
if ($_.Groups[1].Value) {
write-host "key at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'"
if ($_.Groups[3].Value) {
write-host "value at $($_.Groups[3].Index) = '$($_.Groups[3].Value)'"
} # end if
} # end if
} # next match

产量

start with
key1(value1) key2(value2)
key3(value3) key3.5
key4 key5(value5) GoofyStuff(I like kittens)
key6 key7 ForReal-Things(be sure to vote)
key8

found
key at 0 = 'key1'
value at 5 = 'value1'
key at 13 = 'key2'
value at 18 = 'value2'
key at 27 = 'key3'
value at 32 = 'value3'
key at 40 = 'key3.5'
key at 48 = 'key4'
key at 53 = 'key5'
value at 58 = 'value5'
key at 67 = 'GoofyStuff'
value at 78 = 'I like kittens'
key at 95 = 'key6'
key at 100 = 'key7'
key at 105 = 'ForReal-Things'
value at 120 = 'be sure to vote'
key at 138 = 'key8'

总结

  • (?<=^|[\s)\n]*)查找键的开头,假定每个键位于字符串的开头,或者紧跟在\n、“(” 或空格之后 - (?<=^|[\s)\n]*)这在 Java 中可能不起作用,因为是 java 如何处理具有未定义大小的环视的错误/功能。 ( see also )
  • (?<=^|[\s)\n])查找键的开头,假定每个键位于字符串的开头,或者紧跟在\n、“(” 或空格之后 - (?<=^|[\s)\n])。这种环顾四周似乎适用于 C# 和 Powershell

  • ([^(\n\s]*)返回直到下一个“(”、\n 或\s 的所有字符

  • ([(]([^)\n]*)[)])?如果存在则返回 parans 内的值

    循环内的额外逻辑测试 Matches 数组以验证是否找到了键名或值。在 powershell 中,$Matches 会自动填充字符串中的所有匹配项。

关于java - 使用 Java 和 Regex 拆分复杂的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16323210/

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