Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 解析字符串以使用Scala中的正则表达式创建对象_Regex_Scala - Fatal编程技术网

Regex 解析字符串以使用Scala中的正则表达式创建对象

Regex 解析字符串以使用Scala中的正则表达式创建对象,regex,scala,Regex,Scala,我有一个字符串的输入列表,我想使用正则表达式将其转换为对象列表。在下面的代码中,为了简单起见,我不是在创建对象,而是将它们打印到stdout 我能够支持一些输入字符串,但不能支持整个列表。有人能告诉我我做错了什么吗 lazy val TIMESTAMP_PATTERN:Regex=“”(年|月|日|小时)\([a-zA-Z+)[,]?([a-zA-Z*)\)”。r lazy val BUCKET\ u模式:Regex=“”(BUCKET)\((.+)(,)(.+)[,]?(.*)\)“” 序号(

我有一个字符串的输入列表,我想使用正则表达式将其转换为对象列表。在下面的代码中,为了简单起见,我不是在创建对象,而是将它们打印到
stdout

我能够支持一些输入字符串,但不能支持整个列表。有人能告诉我我做错了什么吗

lazy val TIMESTAMP_PATTERN:Regex=“”(年|月|日|小时)\([a-zA-Z+)[,]?([a-zA-Z*)\)”。r
lazy val BUCKET\ u模式:Regex=“”(BUCKET)\((.+)(,)(.+)[,]?(.*)\)“”
序号(
“年份(时间戳)”,
“年份(时间戳,我的年份)”,
“月份(时间戳)”,
“月份(时间戳,我的月份)”,
“日期(时间戳)”,
“天(时间戳,我的天)”,
“小时(时间戳)”,
“小时(时间戳,我的小时)”,
“桶(id,32)”,
“桶(id,32,我的桶)”,
).foreach{input=>输入匹配{
case TIMESTAMP_PATTERN(transform,sourceColumn,targetColumn)=>println(s“$transform:::$sourceColumn:::-$targetColumn”)
case BUCKET_模式(sourceColumn,numBuckets)=>println(s“BUCKET::$sourceColumn:::$numBuckets”)
case BUCKET_模式(sourceColumn,numBuckets,targetColumn)=>println(s“BUCKET::$sourceColumn:::$numBuckets::$targetColumn”)
案例z=>println(s“意外匹配:$z”)
}
}
输出

年份:::时间戳::-
意外匹配:年(时间戳,我的年)
月份:::时间戳::-
意外匹配:月份(时间戳,\我的\月份)
日期:::时间戳::-
意外匹配:天(时间戳,我的天)
小时:::时间戳::-
意外匹配:小时(时间戳,我的小时)
意外匹配:bucket(id,32)
意外匹配:bucket(id,32,\u MY\u bucket)

我在您的regexp和匹配中做了一些修复:

lazy val TIMESTAMP_PATTERN: Regex = """(year|month|day|hour)\((\w+)(?:,\s+)?(\w*)\)""".r
lazy val BUCKET_PATTERN: Regex = """bucket\((\w+),(?:\s+)?(\w+)(?:,\s+)?(\w*)\)""".r

  Seq(
    "year(timestamp)",
    "year(timestamp, _MY_YEAR)",
    "month(timestamp)",
    "month(timestamp, _MY_MONTH)",
    "day(timestamp)",
    "day(timestamp, _MY_DAY)",
    "hour(timestamp)",
    "hour(timestamp, _MY_HOUR)",
    "bucket(id, 32)",
    "bucket(id, 32, _MY_BUCKET)",
  ).foreach {
    case TIMESTAMP_PATTERN(transform, sourceColumn, "") => println(s"$transform ::: $sourceColumn")
    case TIMESTAMP_PATTERN(transform, sourceColumn, targetColumn) => println(s"$transform ::: $sourceColumn :::- $targetColumn")
    case BUCKET_PATTERN(sourceColumn, numBuckets, "") => println(s"bucket ::: $sourceColumn ::: $numBuckets")
    case BUCKET_PATTERN(sourceColumn, numBuckets, targetColumn) => println(s"bucket ::: $sourceColumn ::: $numBuckets ::: $targetColumn")
    case z => println(s"Unexpected match: $z")
  }
现在的输出是:

year ::: timestamp
year ::: timestamp :::- _MY_YEAR
month ::: timestamp
month ::: timestamp :::- _MY_MONTH
day ::: timestamp
day ::: timestamp :::- _MY_DAY
hour ::: timestamp
hour ::: timestamp :::- _MY_HOUR
bucket ::: id ::: 32
bucket ::: id ::: 32 ::: _MY_BUCKET
以下是我所做的更改:

  • ?:
    添加到由
    和空格组成的组中,以使这些组不被捕获。使用此方法,空格仍然是可选的,但不会影响端点匹配
  • 已从bucket中删除(),因此它不是捕获组
  • 由于最后一个匹配项是可选的,并且可以为空,因此使用较少的项修改模式以匹配此情况。请注意,如果最后一列不存在,则其捕获组将为空