Сопоставление регулярных выражений с использованием Matcher и Pattern - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь сделать регулярное выражение для числа на основе следующих условий, однако при этом возвращается пустая строка

import java.util.regex.Matcher
import java.util.regex.Pattern



object clean extends App {

      val ALPHANUMERIC: Pattern = Pattern.compile("^[a-zA-Z0-9]*$")
      val SPECIALCHAR: Pattern = Pattern.compile("[a-zA-Z0-9\\-#\\.\\(\\)\\/%&\\s]")
      val LEADINGZEROES: Pattern = Pattern.compile("^[0]+(?!$)")
      val TRAILINGZEROES: Pattern = Pattern.compile("\\.0*$|(\\.\\d*?)0+$")

      def evaluate(codes: String): String = {

        var str2: String = codes.toString

        var text:Matcher = LEADINGZEROES.matcher(str2)
        str2 = text.replaceAll("")

        text = ALPHANUMERIC.matcher(str2)
        str2 = text.replaceAll("")

        text = SPECIALCHAR.matcher(str2)
        str2 = text.replaceAll("")

        text = TRAILINGZEROES.matcher(str2)
        str2 = text.replaceAll("")


      }

    }

код возвращает пустую строку для совпадения LEADINGZEROES.

scala>  println("cleaned value :" + evaluate("0001234"))
cleaned value :

Какие изменения я должен сделать, чтобы код работал так, как я ожидал.В основном я пытаюсь удалить начальные / конечные нули, и если числа имеют специальные символы / алфавитно-цифровые значения, чем все значение должно быть возвращено null

1 Ответ

0 голосов
/ 04 июня 2018

Ваш LEADINGZEROES шаблон работает правильно, так как

val LEADINGZEROES: Pattern = Pattern.compile("^[0]+(?!$)")
println(LEADINGZEROES.matcher("0001234").replaceAll(""))

дает

//1234

Но тогда есть шаблон, соответствующий

text = ALPHANUMERIC.matcher(str2)

, который заменяет все алфавитно-цифровой до "" и это str как пусто ("")

Как и при

val ALPHANUMERIC: Pattern = Pattern.compile("^[a-zA-Z0-9]*$")
val LEADINGZEROES: Pattern = Pattern.compile("^[0]+(?!$)")
println(ALPHANUMERIC.matcher(LEADINGZEROES.matcher("0001234").replaceAll("")).replaceAll(""))

будет напечатано пусто

Обновлено

Как вы прокомментировали

if there is a code that is alphanumeric i want to make that value NULL but in case of leading or trailing zeroes its pure number, which should return me the value after removing zeroes but its also returning null for trailing and leading zeroes matches and also how can I skip a match , suppose i want the regex to not match the number 0999 for trimming leading zeroes

Вы можете написать свою функцию оценки и регулярные выражения, как показано ниже

val LEADINGTRAILINGZEROES = """(0*)(\d{4})(0*)""".r
val ALPHANUMERIC = """[a-zA-Z]""".r

def evaluate(codes: String): String = {
  val LEADINGTRAILINGZEROES(first, second, third) = if(ALPHANUMERIC.findAllIn(codes).length != 0) "0010" else codes
  if(second.equalsIgnoreCase("0010")) "NULL" else second
}

, которая должна дать вам

println("cleaned value : " + evaluate("000123400"))
//    cleaned value : 1234
println("alphanumeric : " + evaluate("0001A234"))
//    alphanumeric : NULL
println("skipping : " + evaluate("0999"))
//    skipping : 0999

Я надеюсь, что ответполезно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...