Regex для поиска строки с __ и несколькими _, а затем __ для получения желаемого результата

Я пытаюсь создать регулярное выражение, чтобы найти строку с двойным подчеркиванием__ , несколько знаков подчеркивания_ а затем еще одно двойное подчеркивание__ и извлеките часть перед финальной__<string>
Первый разделитель должен быть__ а затем несколько_ , а строка заканчивается на__<String>

Результат должен быть таким, чтобы строка перед вторым __

пример 1-UK__SATHISH_KUMAR__LONDON должен привести кUK__SATHISH_KUMAR

пример 2-UK__SATHISH_KUMAR_MALE__LONDON должен привести кUK__SATHISH_KUMAR_MALE

public static final String RULE_FILE_NAME_PATTERN =
    "(([a-zA-Z]+)__(([a-zA-Z]+_[a-zA-Z]+_[a-zA-Z]+_[a-zA-Z]+)|([a-zA-Z]+_[a-zA-Z]+_[a-zA-Z]+)|([a-zA-Z]+_[a-zA-Z]+)|([a-zA-Z]+)))(__[\\w]+)*";

Этот шаблон работает, но не работает с sonarqube, поскольку он длинный, может ли кто-нибудь помочь получить более короткое регулярное выражение?

Источник
  • 0
    Выключите это предупреждение , sonarqube здесь плохо справляется.
  • 0
    str.take(str lastIndexOf "__")
  • 0
    Хммм, похоже, требование было изменено - OP изначально указывал извлечение подстроки before the second __ таким образом предполагая, что может быть дополнительный __ , но последнее редактирование изменило его на извлечение before the final __<string> что было бы гораздо более простым соответствием ( например, используя жадное совпадение .*
  • 0
    @Stephen P, как одобрить предложенные изменения
Codelisting
за 0 против

Вы можете сгруппировать[A-Za-z]+_[A-Za-z]+ подшаблон в не фиксируемую группу повторяющихся вхождений, как(?:[A-Za-z]+_[A-Za-z]+)* и опционально настройте определенные части рисунка в соответствии с вашими конкретными требованиями, как показано ниже:

val p = """([A-Za-z]+__(?:[A-Za-z]+(?:_[A-Za-z]+)?)*)(?:__.*)?""".r

val strings = List(
  "uk__john_doe__london__edmonton",
  "us__zoe_smith_female__new_york__manhattan",
  "au__dave_clark_male__sidney",
  "fr__alex__paris",
  "jp__yumiko",
  "no_double_underscore"
)

strings.collect{ case p(x) => x }
// res1: List[String] = List(
//   "uk__john_doe",
//   "us__zoe_smith_female",
//   "au__dave_clark_male",
//   "fr__alex",
//   "jp__yumiko"
// )

Обратите внимание, что шаблон Regex можно упростить, используя ленивые совпадения, как показано ниже, если строка не должна строго следоватьalphabets_alphabets подшаблон:

val p = """(.*?__.*?)(?:__.*)?""".r
  • 0
    Спасибо @Leo C. Шаблон работает для всех логик и строк. Кроме последнего шаблона строки .. 1) fr__alex__paris на fr__alex и не работает для 2) fr__alex на fr__alex
  • 0
    Если быть точным, это результат, которого я ожидаю ======================================== ============================ * 1) "STRING1__STRING2" = "STRING1__STRING2" * * 2) "STRING1__STRING2__STRING3_STRING4_STRING5" = "STRING1__STRING2" * * 3) "STRING1__STRING2_STRING3__STRING4_STRING5" = "STRING1__STRING2_STRING3" * * 4) "STRING1__STRING2_STRING3_STRING4" = "STRING1__STRING2_STRING3_STRING4" * * 5) "STRING1__STRING2_STRING3_STRING1" * * 5) "STRING1__STRING2_STRING3_STRING" = "STRING1__STRING2_STRING3_STRING" = "STRING1__STRING2_STRING3_STRING" = "STRING1__STRING2_STRING3_STRING" = "STRING1__STRING2_STRING3_STRING" = "STRING1__STRING2_STRING3_STRING"
  • 0
    Основываясь на вашем примере, вы можете просто сделать последнюю подстроку с ведущим __ необязательной. Пожалуйста, посмотрите мой измененный ответ.
за 0 против

Если вам просто нужен весь текст перед последним __, вы можете просто использовать:

(.*)__

Это жадный матч, и он захватит все в группе 1.

за 0 против
  1. извините Великобритания была просто примером, это могут быть любые символы ENGLAND__SATHISH_KUMAR__LONDON

Все еще не ясно

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

(\w+__.*)__

Ваш вопрос требует точности, потому что вы возвращаете символы UK перед тем, что вы объявляете в качестве первого разделителя __

Предполагая, что вам всегда нужно 2 символа, прежде чем вы сможете сделать

(\w{2}__.*)__
  • 0
    извините Великобритания была просто примером, это могут быть любые символы ENGLAND__SATHISH_KUMAR__LONDON
  • 0
    См. Мой обновленный ответ, но вы всегда должны определять, что хотите :-)
Codelisting
Популярные категории
На заметку программисту