【问题标题】:Scala get a substringScala得到一个子字符串
【发布时间】:2021-10-21 08:04:54
【问题描述】:

我正在尝试在 scala 中获取子字符串。我拥有的字符串如下:

fromTo: NT=xxx_bt_bsns_m,OD=ntis,OS=wnd,SX=xs,SZ=ddp,
fromTo: NT=xds_bt2_bswns_m,OD=nis,OS=wnd,SX=xs,SZ=ddp,
fromTo: NT=xxa_bt1_b1ns_m,OD=nts,OS=nd,SX=xs,SZ=ddp

我只想得到一个子字符串:

 xxx_bt_bsns_m

编辑: 这个子串可以是其他的,例如 ddd_zn1_ldk

那么我必须尝试获取所有以 NT 开头并以“,”结尾的字符串吗?

我从 scala 开始,因此我对此表示怀疑。

提前致谢!

【问题讨论】:

    标签: string scala substring


    【解决方案1】:

    对于您的示例字符串,您可以先匹配模式,并为fromTo:之后的部分使用捕获组

    使用逗号拆分组 1 值,如果可以有多个值,则过滤集合以查找以 NT= 开头的值。

    fromTo:\h+([A-Z]+=[^\s,=]+(?:,[A-Z]+=[^\s,=]+)*)
    

    Regex demo

    部分模式匹配:

    • fromTo:\h+ 匹配 fromTo: 和 1 个或多个水平空格
    • ( 捕获第 1 组
      • [A-Z]+=[^\s,=]+ 匹配 1+ 个大写字符 = 和 1+ 个除 , = 或空白字符以外的字符
      • (?:,[A-Z]+=[^\s,=]+)* 可以选择用逗号重复相同的内容
    • )关闭第一组

    例如

    val s = "fromTo: NT=xxa_bt1_b1ns_m,OD=nts,OS=nd,SX=xs,SZ=ddp,NT=aaaaaa fromTo: NT=bbbbbbbbb"
    val pattern = """fromTo:\h+([A-Z]+=[^\s,=]+(?:,[A-Z]+=[^\s,=]+)*)""".r
    
    val result: Iterator[Array[String]] = pattern.findAllMatchIn(s).map(m =>
      m.group(1)
        .split(",")
        .filter(s => s.startsWith("NT=")))
    
    result.foreach(a => a.foreach(println))
    

    输出

    NT=xxa_bt1_b1ns_m
    NT=aaaaaa
    NT=bbbbbbbbb
    

    【讨论】:

    • 哇非常感谢,但我对正则表达式有疑问,如果字符串的开头不是 fromto 并且可能是另一个甚至这个,会怎么样?
    • @CloudSparkie 在这种情况下,您可以省略锚点并使用\w+:\h+([A-Z]+=[^\s,=]+(?:,[A-Z]+=[^\s,=]+)*),? 查看regex demoScala demo 该示例找到单个匹配项,如果您可以多次出现相同的模式,您可以改用findAllIn
    • 非常感谢您的帮助,抱歉回复晚了,我正在尝试,看起来不错。但是有了这个我只能得到第一个匹配,所以要得到所有的匹配,我必须使用 findAllMatchIn 吗?过滤器也应该改变,对吧?
    • @CloudSparkie 没错,但是你将不得不省略锚fromTo:\h+([A-Z]+=[^\s,=]+(?:,[A-Z]+=[^\s,=]+)*),?
    • 但我怀疑过滤器,如果我使用 findAllMatchIn,过滤器会给我一个错误,因为我使用的是迭代器而不是选项
    【解决方案2】:

    我们可以在这里使用正则表达式替换:

    val input = "fromTo: NT=xxx_bt_bsns_m,OD=ntis,OS=wnd,SX=xs,SZ=ddp"
    val output = input.replaceAll("^.*\\bNT=([^,]+).*$", "$1")
    println(output)  // xxx_bt_bsns_m
    

    【讨论】:

    • 谢谢你的帮助蒂姆,对不起,我忘了说这个字符串可以改变:| ,我更新了帖子!
    • 我的答案不会因您的编辑而改变,它已经满足了您的要求。
    • 哦,对了!如果有多个 NT=,例如,我如何将所有内容分开并存储在 DF 中?
    • 这不是您最初提出的问题,也不是回答的问题。
    • 对不起,我的错,我知道,但我忘了把它放在帖子里:|
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2014-05-08
    • 2019-10-19
    相关资源
    最近更新 更多