获取切片的索引

时间:2016-02-27 18:36:31

标签: regex scala

我想对Scala中的字符串进行一些处理。第一阶段是查找文章索引,例如:"A "" A ""a "" a "。我想这样做:

"A house is in front of us".indexOfSlice("\\s+[Aa] ")

我认为这应该返回0,因为子字符串首先在字符串的第一个位置匹配。

但是,这会返回-1

为什么会返回-1?正在使用的正则表达式是不正确的?

2 个答案:

答案 0 :(得分:3)

我输入的其他答案只是忽略了这一点。您的问题是indexOfSlice没有采用正则表达式,而是序列中的子序列。所以修复正则表达式根本没有帮助。

试试这个:

val pattern = "\\b[Aa]\\b".r.unanchored
for (mo <- pattern.findAllMatchIn("A house is in front of us, a house is in front of us all")) {
    println("pattern starts at " + mo.start)
}
//> pattern starts at 0
//| pattern starts at 27

(也有固定的正则表达式)

编辑:针对"\\s*[Aa] "

的流行但错误的建议的反例
val pattern2 = "\\s*[Aa] ".r.unanchored 
for (mo <- pattern2.findAllMatchIn("The agenda is hidden")) {
  println("pattern starts at " + mo.start)
}
//> pattern starts at 9

答案 1 :(得分:0)

我在你的正则表达式中看到了一个错误。你的正则表达式正在搜索

  1. 至少一次空格(\ s +)
  2. 一封信(A或a)
  3. 但是您匹配的字符串并不包含开头的空格。这就是为什么它没有给你索引0但是-1。

    您可以将您的正则表达式编写为"^\\s*[Aa] "

    以下是示例:

    val text = "A house is in front of us";
    
    val matcher = Pattern.compile("^\\s*[Aa] ").matcher(text)
    var idx  = 0;
    
    if(matcher.find()){
      idx = matcher.start()
    }
    println(idx)
    

    它应该按预期返回 0