Scala 正则表达式在字符串中的单词之间和之后匹配
Scala Regex match in between and after words in a string
Scala 让我很难做一个在我曾经测试过的 "text editor" 上很容易工作的正则表达式。
这些是字符串匹配的规则:
对于单词"dek affect"
- 单词之间的任何符号都可以,除了“.”
- 单词之间不允许有任何数值
- 除了 "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>
Scala 让我很难做一个在我曾经测试过的 "text editor" 上很容易工作的正则表达式。
这些是字符串匹配的规则:
对于单词"dek affect"
- 单词之间的任何符号都可以,除了“.”
- 单词之间不允许有任何数值
- 除了 "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>