регулярное выражение, чтобы найти определенный шаблон в строке в Java - PullRequest
0 голосов
/ 11 мая 2018

Мне нужно найти определенный шаблон в строке и извлечь из него подстроку.Например, строка:

{'Opening Cost P&L per store','Opening Costs Capital per store','Average Monthly Revenue','GROSS MARGIN %'}] = N:DB('Store Cost', 
    !Country and Region, DB('New Store Plan', !Country and Region, 
    !ID numbers, !Budget version, 'Retailer Type'), ATTRS('New Stores', 
    !New Stores, '}Map_}Link_New Store Plan_3CStore Cost'), DB('New Store Plan', 
    !Country and Region, !ID numbers, !Budget version, 'Size'), 
    DB('New Store Plan', !Country and Region, !ID numbers, !Budget version, 
    'Franchise/Corporate'), 'DATA')

Я должен искать:
DB(' только, а не другой шаблон, такой как S:DB(' или DB('}.

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

DB('Metrics cube-HumanResource',    !country, !Time, !gometric, !Metric Indicators), CONTINUE)​
DB('Metrics cube-InternalProcess',     !country, 'Total of Product', !Time, !gometric, !Metric Indicators), CONTINUE);​

, тогда вывод будет:

1 - Metrics cube-HumanResource
2 - Metrics cube-InternalProcess​

Это мой код.Но ничего не печатается:

public class StringRegex {
    public static void main(String[] args) {
        String str = "{'Opening Cost P&L per store','Opening Costs Capital per store','Average Monthly Revenue','GROSS MARGIN %'}] = N:DB('Store Cost', \n" +
                "    !Country and Region, DB('New Store Plan', !Country and Region, \n" +
                "    !ID numbers, !Budget version, 'Retailer Type'), ATTRS('New Stores', \n" +
                "    !New Stores, '}Map_}Link_New Store Plan_3CStore Cost'), DB('New Store Plan', \n" +
                "    !Country and Region, !ID numbers, !Budget version, 'Size'), \n" +
                "    DB('New Store Plan', !Country and Region, !ID numbers, !Budget version, \n" +
                "    'Franchise/Corporate'), 'DATA')";
        String[] strArray = str.split(",");
        for(String s : strArray){
            if(s.matches("DB\\('.+'")){
                System.out.println(s);
            }
        }
    }
}

1 Ответ

0 голосов
/ 11 мая 2018

Я бы пошел с Pattern и Matcher вместо разбиения String.Вы получите результат легче.Используя следующее регулярное выражение:

.*?[^:]DB\((.*?)\).*?

Это будет захватывать содержимое каждой БД (. *), Не предшествующей :.Использование ленивого квантификатора *? предотвратит проблему захвата не только текста до закрывающей скобки.

С Regex101 :

    String regex = ".*?[^:]DB\\((.*?)\\).*?";
    String string = "{'Opening Cost P&L per store','Opening Costs Capital per store','Average Monthly Revenue','GROSS MARGIN %'}] = N:DB('Store Cost', \n"
            + "    !Country and Region, DB('New Store Plan', !Country and Region, \n"
            + "    !ID numbers, !Budget version, 'Retailer Type'), ATTRS('New Stores', \n"
            + "    !New Stores, '}Map_}Link_New Store Plan_3CStore Cost'), DB('New Store Plan', \n"
            + "    !Country and Region, !ID numbers, !Budget version, 'Size'), \n"
            + "    DB('New Store Plan', !Country and Region, !ID numbers, !Budget version, \n" + "    'Franchise/Corporate'), 'DATA')";

    Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.DOTALL);
    Matcher matcher = pattern.matcher(string);

    while (matcher.find()) {
        System.out.println("> " + matcher.group(1));
    }

Результаты:

> 'New Store Plan', !Country and Region, 
    !ID numbers, !Budget version, 'Retailer Type'  
> 'New Store Plan', 
    !Country and Region, !ID numbers, !Budget version, 'Size'  
> 'New Store Plan', !Country and Region, !ID numbers, !Budget version, 
    'Franchise/Corporate'  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...