Разбейте строку, имеющую по крайней мере один специальный символ, такой как - # и пробел - PullRequest
1 голос
/ 05 ноября 2019

У меня будут такие слова

String text = [ name abc ]
String text = [ name # abcd]
String text = [ name - abcd]
String text = [ name  abcde    ]

Я хочу разделить эти слова, чтобы получить имена как abc, abcd, abcde

Разделителем здесь могут быть только пробелы, пробелы # пробелы,пробелы-пробелы и nospace.

У меня есть это регулярное выражение для соответствия

Pattern pat = Pattern.compile("\[\s*name\s*(-|#)\s*[a-z0-9]+\s*\]",Pattern.CASE_INSENSITIVE);
Matcher matcher = pat.matcher(text);
    while (matcher.find()) {
        String subseq = matcher.group();
        String extractName = subseq.split("(-|#|\\s*)", 2)[1].replaceAll("]", "").trim();
        }

Этот код не работает для [name mynameisDON], однако он работает для [name: abc]

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

1 Ответ

1 голос
/ 05 ноября 2019

Попробуйте это:

private static void test(String text) {
    Matcher m = Pattern.compile("\\[\\s*(?i:name)\\s+(?:[#-]\\s+)?([^\\]\\s]+)\\s*\\]").matcher(text);
    if (m.matches()) {
        System.out.println("name: '" + m.group(1) + "'");
    } else {
        System.out.println("Invalid: '" + text + "'");
    }
}

Тест

test("[ name abc ]");
test("[ name # abcd]");
test("[ name - abcd]");
test("[ name  abcde    ]");
test("[ name : abcd]");
test("[ name#abcd]");

Выход

name: 'abc'
name: 'abcd'
name: 'abcd'
name: 'abcde'
Invalid: '[ name : abcd]'
Invalid: '[ name#abcd]'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...