подстрока аналогичной строковой структуры - PullRequest
0 голосов
/ 21 июня 2020

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

  1. Ex1: "Can someone help JAVA_example1_Home or JAVA_example2_Home"

  2. Ex2: "Need one more help for JAVA_example3_Home"

Как видите, JAVA_(name)_Home является обычным, но меняется только имя.

Мне нужно вытащить всю подстроку имя как

  1. Ex1: Вывод -> example1, example2
  2. Ex2: Вывод -> example3

Ответы [ 2 ]

0 голосов
/ 21 июня 2020
public static void main(String[] args) {

    String s1 = "Can someone help JAVA_example1_Home or JAVA_example2_Home";
    String s2 = "Need one more help for JAVA_example3_Home";
    String s3 = "I don't need help";

    Map.Entry<String, List<String>> r1 = extractNameHome(s1);
    Map.Entry<String, List<String>> r2 = extractNameHome(s2);
    Map.Entry<String, List<String>> r3 = extractNameHome(s3);

    System.out.println(r1.getKey() + " -> " + r1.getValue().toString());
    System.out.println(r2.getKey() + " -> " + r2.getValue().toString());
    System.out.println(r3.getKey() + " -> " + r3.getValue().toString());

}

public static Map.Entry<String, List<String>> extractNameHome(String sentence){

    Map.Entry<String, List<String>> result = Map.entry(sentence, new ArrayList<>());

    Pattern pattern = Pattern.compile("(?:JAVA_)(?<name>.+?)(?:_Home)");
    Matcher matcher = pattern.matcher(sentence);

    while(matcher.find()){

        result.getValue().add(matcher.group("name"));

    }

    return result;

}
0 голосов
/ 21 июня 2020
import java.util.regex.Matcher;  
import java.util.regex.Pattern; 
import static java.lang.System.out;
class Playground {
    public static void main(String[ ] args) {
         String [] testStrings = 
         {"Can someone help JAVA_example1_Home or JAVA_example2_Home",
          "Need one more help for JAVA_example3_Home"
         };
         Pattern pattern = Pattern.compile("(?<=JAVA_)(?<name>.*?)(?=_Home)"); 
         for (String s : testStrings) {
            out.println("Test String: " + s);
            Matcher matcher = pattern.matcher(s);
            while (matcher.find()) {
                out.println("matched: " + matcher.group("name"));
            }
            out.println("===");
         }
  
    }
}

Выходы:

Test String: Can someone help JAVA_example1_Home or JAVA_example2_Home
matched: example1
matched: example2
===
Test String: Need one more help for JAVA_example3_Home
matched: example3
===

Объяснение:

  • (?<=JAVA_): Положительный просмотр назад
  • (?<name>.*?): Именованная группа захвата с нежадным расширением .*?
  • (?=_Home): положительный просмотр вперед

Regex 101 Ссылка:

https://regex101.com/r/A3rzf1/2

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