Scala Regex在字符串中的单词之间和之后的匹配

时间:2019-01-22 00:04:35

标签: regex scala regex-negation

Scala使我很难做一个正则表达式,该正则表达式可以在我以前测试的“文本编辑器”上轻松工作。

这些是字符串匹配的规则:

“敏捷影响”一词

  1. 单词之间的任何符号都可以,“。”除外。
  2. 单词之间不允许有任何数值
  3. 除“ s”外,最后一个单词之后的任何字母均不允许。

以下是一些示例情况:
1.“林中的敏捷影响” =>确定。
2.“我的好感在这里” =>确定。
3.“ dek?affect#” =>确定。
4.“ dek1affect ” =>不好。
5.“ 影响。”,=>不正确。
6.“ 影响敏捷” =>不好。

我已经尝试了除示例2和4以外的示例,适用于1、3、5和6的代码。

// For example case 2
"dek affect" matches ".*dek[^\\.]affect[^a-r t-z].*"
// output: false

// For example case 4
"dek1affect" matches ".*dek[^\\.]affect[^a-r t-z].*"
// output: false

我希望输出为“ true”,但显示为“ false”。否定的结尾处是“ s”,但是我如何使其变为可选?

另一个问题是如何使正则表达式动态化,例如如果我在字符串中包含3个或更多单词,在 Scala 中的单词之间使用正则表达式的任何简单方法会怎样?

2 个答案:

答案 0 :(得分:2)

这非常接近。至少它可以通过您的所有测试。

val word1 = "dek"
val word2 = "affect"

Seq("dek affects in the forest" //=> OK .
   ,"my dek affect is here"     //=> OK .
   ,"dek?affect#"               //=> OK .
   ,"dek1affect"                //=> NOT OK .
   ,"dek. affect"               //=> NOT OK .
   ,"dek affecting"             //=> NOT OK .
).map(_ matches s".*$word1[^.\\w]$word2[s\\W].*")
//res0: Seq[Boolean] = List(true, true, true, false, false, false)

答案 1 :(得分:1)

另一种方法..

请注意,您的逻辑不一致。您说Any character after the last word other than "s" is not allowed.,但允许dek?affect#被匹配。请查看

scala> lst
res53: Seq[String] = List(dek affects in the forest, my dek affect is here, dek?affect#, dek1affect, dek. affect, dek affecting)

scala>  lst.map( _ matches ".*dek.(?<!=\\d)(?<!=\\.)(affect(s|#|.(?<= ))).*" )
res54: Seq[Boolean] = List(true, true, true, false, false, false)

scala>

编辑:

scala> lst.map( _ matches """.*dek.(?<!=\d|\.)affect.(?<=[^a-rt-z]).*""" )
res68: Seq[Boolean] = List(true, true, true, false, false, false)

scala>