Scala Regex соответствует между и после слов в строке - PullRequest
0 голосов
/ 22 января 2019

Scala затрудняет мне создание регулярного выражения, которое легко работает с "текстовым редактором", который я использовал для тестирования.

Это правила соответствия строк:

Для слова "дек влияет"

  1. Любой символ между словами в порядке, кроме "."
  2. Любые числовые значения не допускаются между словами
  3. Запрещен любой алфавит после последнего слова, кроме "s".

Ниже приведены несколько примеров:
1. « дек влияет на в лесу» => ОК.
2. «Мой Дек влияет на здесь» => ОК.
3. « dek ?ffect # » => ОК.
4. " dek1affect " => НЕ ОК.
5. « Дек. Влияет », => НЕ ОК.
6. « dek, влияющий на » => НЕ ОК.

Я пробовал код, который отлично работает для 1, 3, 5 и 6 из примеров, за исключением 2 и 4.

// 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 голосов
/ 22 января 2019

Еще один способ ..

Обратите внимание, что в вашей логике есть несоответствие .. вы говорите 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>
0 голосов
/ 22 января 2019

Это довольно близко. По крайней мере, он проходит все ваши тесты.

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)
...