Scala 获取一个子串

Scala get a substring

我正在尝试在 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 开始的,因此我对此有疑问。

提前致谢!

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

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

对于您的示例字符串,您可以先匹配模式,然后对 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,=]+)* 可选择重复相同的内容,并在后面加上逗号
  • ) 关闭组 1

例如

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