Scala 以特定正则表达式开头的只读行
我想要以特定正则表达式开头的只读行Scala 以特定正则表达式开头的只读行,scala,apache-spark,Scala,Apache Spark,我想要以特定正则表达式开头的只读行 val rawData = spark.read.textFile(file.path).filter(f => f.nonEmpty && f.length > 1 && f.startsWith("(")) 直到现在我都是这么做的 现在我发现我的条目以: (W) );27536-或(W)28325-(分隔符后5位) 我只想读以(W)开头的行;1234-(分隔符后4位数字) 捕获此信息的正则表达式类似于:\(
val rawData = spark.read.textFile(file.path).filter(f => f.nonEmpty && f.length > 1 && f.startsWith("("))
直到现在我都是这么做的
现在我发现我的条目以:
(W) );27536-或(W)28325-(分隔符后5位)我只想读以(W)开头的行;1234-(分隔符后4位数字) 捕获此信息的正则表达式类似于:
\(\D\)(;\s)\D{4}
用于布尔返回,或\(\D\)(;\124s)\D{4}-.
用于字符串匹配返回
我现在的问题是,我不知道如何在read.textFile命令中包含正则表达式。f、 startswith仅适用于字符串
f、 匹配也仅适用于字符串 我也尝试过使用,但这会返回一个字符串而不是布尔值,我不能在filter函数中使用它
任何帮助都将不胜感激。我找到了问题的答案 命令需要如下所示
val lineregex = """\(\D\)(;|\s)\d{4}-.*""".r
val rawData = spark.read.textFile(file.path)
.filter(f => f.nonEmpty && f.length > 1 && lineregex.unapplySeq(f).isDefined )
我找到了我问题的答案 命令需要如下所示
val lineregex = """\(\D\)(;|\s)\d{4}-.*""".r
val rawData = spark.read.textFile(file.path)
.filter(f => f.nonEmpty && f.length > 1 && lineregex.unapplySeq(f).isDefined )
您可以尝试使用
findFirstMatchIn
方法查找正则表达式的匹配项,该方法返回一个选项[match]
:
spark.read.textFile(file.path).filter { line =>
line.nonEmpty &&
line.length > 1 &&
"regex".r.findFirstMatchIn(line).isDefined
}
您可以尝试使用
findFirstMatchIn
方法查找正则表达式的匹配项,该方法返回一个选项[match]
:
spark.read.textFile(file.path).filter { line =>
line.nonEmpty &&
line.length > 1 &&
"regex".r.findFirstMatchIn(line).isDefined
}
其他的答案是过度思考这个问题。只需使用
匹配项
val lineRegex = """\(\D\)(;|\s)\d{4}-.*"""
val ns = List ("(W);1234-something",
"(W);12345-something",
"(W);2345-something",
"(W);23456-something",
"(W);3456-something",
"",
"1" )
ns.filter(f=> f.matches(lineRegex))
导致
List("(W);1234-something", "(W);2345-something", "(W);3456-something")
其他的答案是过度思考这个问题。只需使用
匹配项
val lineRegex = """\(\D\)(;|\s)\d{4}-.*"""
val ns = List ("(W);1234-something",
"(W);12345-something",
"(W);2345-something",
"(W);23456-something",
"(W);3456-something",
"",
"1" )
ns.filter(f=> f.matches(lineRegex))
导致
List("(W);1234-something", "(W);2345-something", "(W);3456-something")
f.startswith仅适用于字符串;f、 匹配也只适用于字符串
为什么这是一个问题?在您的筛选器中,f
是一个字符串。因为筛选器函数需要一个bollean返回值,并且两者都返回一个字符串matrches
不返回字符串,而是一个布尔值。f.startswith仅适用于字符串;f、 匹配也只适用于字符串
为什么这是一个问题?在您的筛选器中,f
是一个字符串。因为筛选器函数需要一个bollean返回,并且两者都返回一个字符串matrches
不返回字符串,而是返回一个布尔值。不,您不需要。你可以只使用f.matches(lineregex)
(非空和长度测试是多余的,因为如果它们失败,那么regexp-matchyea代码现在是多余的,但是为什么这个代码不能正确工作呢?没有说它不能工作。我是在评论“需要看起来像这样”不,它不-matches
更简单、更清晰。好的,谢谢。我现在使用matches。我认为它不起作用,因为我总是在lineregex的末尾放一个.r。但是这不是必需的。我现在用matches命令运行它。..thxNo,你不需要。你可以只使用f.matches(lineregex)
(非空
和长度
测试是冗余的,因为如果它们失败,那么regexp matchyea代码现在也是冗余的,但是为什么这个代码不能正常工作?没有说它不能工作。我是在评论“需要看起来像这样”不,它不-匹配
更简单、更清晰。好的,谢谢。我现在使用匹配。我认为它不起作用,因为我总是在lineregex的末尾放一个.r。但这不是必需的。我现在使用您的matches命令运行它。thxI可能会添加这一点,这取决于整个过程中此特定步骤的性能敏感性Roess,可以共享一个编译的正则表达式(调用<代码>编译模式.Matter(String).MatcSes())/>代码>而不是<代码>字符串。匹配(模式)。在更密集的场景中,人们甚至会考虑重用匹配器对象,而不仅仅是使用适当的线程安全措施的模式。(例如,在sparkrdd.mapPartitions
调用中重用匹配器):我可以补充一点,根据整个过程中此特定步骤的性能敏感性,人们可能更喜欢共享编译的正则表达式(调用compiledPattern.matcher(string).matches()
),而不是string.matches(pattern)在更密集的场景中,人们甚至会考虑重用匹配器对象,而不仅仅是使用适当的线程安全措施(例如,在Skase<代码> RDD中重用匹配器。