Строковое выражение соответствия с использованием java - PullRequest
0 голосов
/ 22 марта 2020

я ищу лучший метод извлечения трех строк из большой строки.

моя строка следующая

x= " some test....  some text (some text, equipmentName: 'XXX', equipmentNumber: 'yyy', equipmentSlot: ‘zzz’) some text"

Я хочу извлечь три строки.

String1 = "equipmentName: 'XXX'"
String2= "equipmentNumber: 'yyy'"
String3 = "equipmentSlot: ‘zzz’"

если я использую patteren matcher или просто старый java индекс и последний индекс et c ...

наилучших пожеланий.

Ответы [ 4 ]

0 голосов
/ 22 марта 2020

Вы можете попробовать это:

    String text = " some test....  some text (some text, equipmentName: 'XXX', equipmentNumber: 'yyy', equipmentSlot: 'zzz') some text";
    Pattern pattern = Pattern.compile("equipment[A-Za-z:]+ [A-Za-z'’‘]+");
    Matcher matcher = pattern.matcher(text);
    while(matcher.find()) {
        System.out.println(matcher.group(0));
    }

Выход:

equipmentName: 'XXX'
equipmentNumber: 'yyy'
equipmentSlot: ‘zzz’
0 голосов
/ 22 марта 2020

Вы можете использовать regex как (equipment\w+: (?:['’‘]\w+['‘’])), который будет соответствовать 3 элементам

  • equipment\w+ для разных имен

  • (?:['’‘]\w+['‘’]) запятая вокруг слова в группе без захвата

Дает Pattern p = Pattern.compile("(equipment\\w+: (?:['’‘]\\w+['‘’]))");


  1. С классами c зацикливание на результате:

    Matcher m = p.matcher(x);
    List<String> res = new ArrayList<>();
    while (m.find()) {
        res.add(m.group());
    }
    
    //[equipmentName: 'XXX', equipmentNumber: 'yyy', equipmentSlot: ‘zzz’]
    System.out.println(res); 
    
  2. С Stream интерфейсом

    List<String> res = p.matcher(x).results().map(MatchResult::group)
                                             .collect(Collectors.toList());
    
    //[equipmentName: 'XXX', equipmentNumber: 'yyy', equipmentSlot: ‘zzz’]
    System.out.println(res); 
    
0 голосов
/ 22 марта 2020

Я бы использовал:

String input = " some test....  some text (some text, equipmentName: 'XXX', equipmentNumber: 'yyy', equipmentSlot: `zzz`) some text";
String pattern = "\\b(?:equipment(?:Name|Number|Slot)):\\s+['`].*?['`]";
Pattern r = Pattern.compile(pattern);

Matcher m = r.matcher(input);
while (m.find()) {
    System.out.println(m.group(0));
}

Это печатает:

equipmentName: 'XXX'
equipmentNumber: 'yyy'
equipmentSlot: `zzz`
0 голосов
/ 22 марта 2020

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

Попробуйте:

String x = " some test....  some text (some text, equipmentName: 'XXX', equipmentNumber: 'yyy', equipmentSlot: ‘zzz’) some text";

List<String> result = new ArrayList<>();

Pattern pattern = Pattern.compile("(equipment\\w+: ['|‘]\\w+['|’])");
Matcher matcher = pattern.matcher(x);

while(matcher.find()) {
    result.add(matcher.group());
}

result.forEach(System.out::println);

Вывод:

equipmentName: 'XXX'
equipmentNumber: 'yyy'
equipmentSlot: ‘zzz’

О регулярном выражении:

  • (...): группа захвата
  • equipment\\w+: Найти детали, начинающиеся с "equipment"
  • ['|‘]: Чтобы поймать как '...', так и ‘...’ детали
  • \\w: Символ слова
  • +: один или несколько раз
...