Scala使我很难做一个正则表达式,该正则表达式可以在我以前测试的“文本编辑器”上轻松工作。
这些是字符串匹配的规则:
“敏捷影响”一词
以下是一些示例情况:
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 中的单词之间使用正则表达式的任何简单方法会怎样?
答案 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>