Оценка соответствия шаблонов Scala Regex - PullRequest
3 голосов
/ 19 июня 2019

Представьте, что у вас есть строка, содержащая символ амперсанда, и моя цель - добавить пробелы между символом & и любым символом, если его нет

ex

Case 1: Body&Soul should be-->Body & Soul (working)
Case 2: Body  &Soul--> Body  & Soul (working)
Case 3: Body&  Soul -->Body &  Soul (working)
Case 4: Body&Soul&Mind -->Body & Soul & Mind (working)

Case 5: Body &Soul& Mind ---> Body & Soul & Mind (not working)
Case 6: Body& Soul &Mind ---> Body & Soul & Mind (not working)
    def replaceEmployerNameContainingAmpersand(emplName: String): String 
    = {
    val r = "(?<! )&(?! )".r.unanchored
    val r2 = "&(?! )".r.unanchored
    val r3 = "(?<! )&".r.unanchored

    emplName match {
     case r() => emplName.replaceAll("(?<! )&(?! )", " & ")

     case r2() => emplName.replaceAll("&(?! )", "& ")

     case r3() => emplName.replaceAll("(?<! )&", " &")
    }
   }

Цель состоит в том, чтобы исправить Случаи 5 и 6: Body &Soul& Mind или Body& Soul &Mind -> Body & Soul & Mind

Но это не работает, потому что, когда происходит случай 2 или 3, случай завершается и не соответствует второму & символ.

Может ли кто-нибудь помочь мне в том, как сопоставить случаи 5 и 6?

1 Ответ

3 голосов
/ 19 июня 2019

Вы можете захватить один необязательный символ пробела на обоих концах & и проверить, совпадают ли они, и заменить соответствующим образом, используя replaceAllIn:

def replaceAllIn(target: CharSequence, replacer: (Match) => String): String
Заменяет все совпадения с помощью функции заменителя.

См. Демоверсию Scala :

val s = "Body&Soul, Body  &Soul, Body&  Soul, Body&Soul&Mind, Body &Soul& Mind, Body& Soul &Mind"
val pattern = """(\s)?&(\s)?""".r
val res = pattern.replaceAllIn(s, m => (if (m.group(1) != null) m.group(1) else " ") + "&" + (if (m.group(2) != null) m.group(2) else " ") )
println(res)
// => Body & Soul, Body  & Soul, Body &  Soul, Body & Soul & Mind, Body & Soul & Mind, Body & Soul & Mind

Шаблон (\s)?&(\s)? сопоставляет и фиксирует в Группе 1 один символ пробела, затем сопоставляет &, а затем захватывает необязательный пробел в Группе 2.

Если группа 1 не равна нулю, есть пробел, и мы сохраняем его, в противном случае заменим пробелом. Та же логика используется для конечного пробела.

...