scala正则表达式实现

时间:2018-05-15 09:49:00

标签: regex

输入中有以下字符串:

val str="11,FDESRTBGTY-DEDE-098-FDR,STR,5,1"

我想在scala中编写一个正则表达式来匹配它 我写了以下代码:

val regtest="""(11|12|13)(,+)(\S*)(,+)(\S*)(,+)(\d+)\)(,+)(\d+)\)""".r
stringin match {
      case regtest(num,comma1,name,comma2,typein,comma3,number1,comma4,number2) =>name + ","  + typein + ","  + "," + number2
      case _ => ""
}

我gt空字符串结果:""

或者想要的结果是:

val stringOut= "FDESRTBGTY-DEDE-098-FDR,STR,1"

任何有关请求的帮助 问候

1 个答案:

答案 0 :(得分:0)

由于\),您的正则表达式不匹配,请将它们全部删除。您的输入字符串没有括号。此外,您希望在最后一个号码前只使用1个逗号,并且您希望得到number1,而不是number2作为结果中的最后一个值:

val regtest="""(11|12|13)(,+)(\S*)(,+)(\S*)(,+)(\d+)(,+)(\d+)""".r
str match {
  case regtest(num,comma1,name,comma2,typein,comma3,number1,comma4,number2) =>println(s"${name},${typein},${number1}")
  case _ => ""
}

请注意,如果您在字符串中只允许使用4个逗号,并且第2个和第3个值不能包含逗号,则"""(1[123])(,)([^\s,]*)(,)([^\s,]*)(,)(\d+)(,)(\d+)""".r可能是更好的模式。另请注意,1[123]是一种更有效,更紧凑的方式来编写(?:11|12|13)

或者,您可以使用

删除字符串中的第一个和最后一个以逗号分隔的项目
str.replaceAll("^[^,]+,|(,[^,]+),[^,]+$", "$1")

此处,^[^,]+,匹配字符串开头(,)以外的^以外的任何1个字符,然后是,或(| )将逗号和1+非逗号字符匹配并捕获到组1(带有(,[^,]+)),然后是字符串末尾的最后,和1+非逗号字符({{ 1}})匹配。删除所有匹配的文本,并使用[^,]+$占位符将捕获组值粘贴回结果中。

请参阅Scala demo