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中删除(),因此它不是捕获组
- 由于最后一个匹配项是可选的,并且可以为空,因此使用较少的项修改模式以匹配此情况。请注意,如果最后一列不存在,则其捕获组将为空