正则表达式在Scala中给予意想不到的额外的结果



我想识别以字符id

开头的列我们尝试了^id*和^(id)*,它们在Regexr中工作,但在Scala中不起作用

Regexr:

RegExr截图Scala(砖)

砖截图

br

所以对你的问题做一个简短的解释,因为我认为仅仅因为你可以解决这个特定的问题而不知道背后的原因和逻辑,并不意味着问题永远不会再发生。当您在正则表达式中使用星号时,它表示某种模式的任意数量(包括0),因此在第一种情况下:

val firstRegex = "^id*".r
// this means the string must start with "i", and can have any consecutive number of "d"s appended to it.
firstRegex.matches("i") // true
firstRegex.matches("idddddddd") // true
firstRegex.matches("iPhone") // false, the expression only accepts sequence of "d"s appended to a single "i"

关于第二个正则表达式,您可以猜到,它接受任意数量的字符串"id"相互追加(包括0):

val secondRegex = "^(id)*".r
secondRegex.matches("ididididid") // true
secondRegex.matches("idi") // false
secondRegex.matches("") // true, zero "id"s

通配符

因此,在您的示例中,您希望列名以字符串id开头,而不考虑其他内容。点(.)是几乎所有正则表达式引擎中的特殊字符,它匹配所有内容。知道了这些,你就可以说

我希望我的列以"id"开头,然后是其后的任何字符(通配符)的任何数字(星号)

:

@ val columnNamePattern = "^id.*".r 
columnNamePattern: scala.util.matching.Regex = ^id.*
@ columnNamePattern.matches("identifier") 
res15: Boolean = true
@ columnNamePattern.matches("merchant_name") 
res16: Boolean = false

答案为^(id),不带*

工作笔记本截图

相关内容

  • 没有找到相关文章

最新更新