Scala 正则表达式在字符串中的单词之间和之后匹配

Scala Regex match in between and after words in a string

Scala 让我很难做一个在我曾经测试过的 "text editor" 上很容易工作的正则表达式。

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

对于单词"dek affect"

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

以下是一些案例:
1. “dek 影响 在森林里”=> OK .
2. "my dek affect is here" => 好的。
3. "dek?affect#" => 好的。
4.“dek1affect”=> 不正常。
5. "dek.affect", => 不正常。
6.“dek 影响”=> 不正常。

除了 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[=46= 中的单词之间做正则表达式的任何简单方法]?

这已经很接近了。至少它通过了你所有的测试。

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)

还有一种方法..

请注意,您的逻辑不一致。您说 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>