Нужна поддержка регулярных выражений для объекта списка - PullRequest
1 голос
/ 07 июня 2019

У меня есть следующая программа,

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;

public class Regex {
    public static void main(String[] args) {
        String VALID_GUID_REGEX = "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}";
        Pattern NOT_PREFIXED_FILES_REGEX =
                Pattern.compile("(^"+VALID_GUID_REGEX+"/\\b(foo|bar)\\b.*)|^[^/]+$");

        List<String> list = new ArrayList<>();
        list.add("256a5037-9fc1-4e60-95c3-523d5ae1c935/foo/44434038019,2019-05-24T09:02:18.695Z,b4786bf4-157a-4f1b-a030-4c5416e1884a");
        list.add("256a5037-9fc1-4e60-95c3-523d5ae1c935/bar/44434038019,2019-05-24T09:02:18.695Z,b4786bf4-157a-4f1b-a030-4c5416e1884a");
        list.add("govcorp/123a5037-9fc1-4e60-95c3-523d5ae1c935/foo/text.doc");
        list.add("156a5037-9fc1-4e60-95c3-523d5ae1c935/123a5037-9fc1-4e60-95c3-523d5ae1c935/delta/text.doc");
        list.add("123a5037-9fc1-4e60-95c3-523d5ae1c935/");

        String[] keys = list.stream()
                .filter(k -> NOT_PREFIXED_FILES_REGEX.matcher(k).find())
                .toArray(String[]::new);

        System.out.println(Arrays.toString(keys));
    }
}

И код работает нормально, кроме последнего элемента в списке, мне нужно выполнить следующее условие,

256a5037-9fc1-4e60-95c3-523d5ae1c935/foo/44434038019,2019-05-24T09:02:18.695Z,b4786bf4-157a-4f1b-a030-4c5416e1884a   -- Pass
256a5037-9fc1-4e60-95c3-523d5ae1c935/bar/44434038019,2019-05-24T09:02:18.695Z,b4786bf4-157a-4f1b-a030-4c5416e1884a   -- Pass
govcorp/123a5037-9fc1-4e60-95c3-523d5ae1c935/foo/text.doc -- Fail
156a5037-9fc1-4e60-95c3-523d5ae1c935/123a5037-9fc1-4e60-95c3-523d5ae1c935/foo/text.doc -- Fail
123a5037-9fc1-4e60-95c3-523d5ae1c935/ - Pass

Давайте рассмотримпервая строка,

256a5037-9fc1-4e60-95c3-523d5ae1c935/bar/44434038019,2019-05-24T09:02:18.695Z,b4786bf4-157a-4f1b-a030-4c5416e1884a 

Если я введу свой ввод "256a5037-9fc1-4e60-95c3-523d5ae1c935 /" - Pass и "256a5037-9fc1-4e60-95c3-523d5ae1c935 / bar /" - Pass, amполучение пути к файлу с сервера.

Рассмотрим случай сбоя, "govcorp /" - Fail и "govcorp / 123a5037-9fc1-4e60-95c3-523d5ae1c935 /" - Fail

Если два GUID последовательностирегистр должен иметь значение FAIL, например

156a5037-9fc1-4e60-95c3-523d5ae1c935 / 123a5037-9fc1-4e60-95c3-523d5ae1c935 / - FAIL

Если только один регистр GUID, например "123e4567-e89b-12d3-a456-426655440001 / "- Pass

Ответы [ 2 ]

3 голосов
/ 07 июня 2019

Здесь мы сначала потерпим неудачу в наших нежелательных строках с простым выражением:

^((?!\.doc).)*$

Демо 1

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

([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})

Демо 2

Test

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

final String regex = "([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})";
final String string = "256a5037-9fc1-4e60-95c3-523d5ae1c935/foo/44434038019,2019-05-24T09:02:18.695Z,b4786bf4-157a-4f1b-a030-4c5416e1884a\n"
     + "256a5037-9fc1-4e60-95c3-523d5ae1c935/bar/44434038019,2019-05-24T09:02:18.695Z,b4786bf4-157a-4f1b-a030-4c5416e1884a\n"
     + "123a5037-9fc1-4e60-95c3-523d5ae1c935/";

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

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

Ссылки
1 голос
/ 07 июня 2019

Хотите ли вы сопоставить все .doc с регулярным выражением или просто сопоставить строку, содержащую подстроку, соответствующую вашему существующему регулярному выражению, включая .doc?

В случае последнего, окружите свое регулярное выражение .*\b {regex} \b.*

Таким образом, вся строка совпадает, и совпадение все еще сохраняется.

^(.*\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})\b.* 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...