Как сделать совпадение регулярного выражения на основе условия? - PullRequest
0 голосов
/ 19 января 2020

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


Вопрос

Как я могу создать регулярное выражение, которое выглядит только так, чтобы соответствовать чему-либо с определенным условием?


Пример

Примером этого может быть, если у нас есть список строки ( это в java):

String nums = "42 36 23827";

, и мы хотим совпадать, только если в конце строки столько же x, сколько там находятся в начале

Что мы хотим в этом примере

В этом примере мы бы хотели, чтобы регулярное выражение проверяло, есть ли в конце такое же количество регулярных выражений, как и в в начале. Условная часть : Если в начале есть x, проверьте, есть ли их в конце, а если они есть, то это совпадение.


Другой пример

Примером этого может быть, если бы у нас был список чисел ( это java) в строковом формате:

String nums = "42 36 23827";

и мы хотим разделить каждое число в список

String splitSpace = "Regex goes here";
Pattern splitSpaceRegex = Pattern.compile(splitSpace);
Matcher splitSpaceMatcher = splitSpaceRegex.matcher(text);
ArrayList<String> splitEquation = new ArrayList<String>();

while (splitSpaceMatcher.find()) {
    if (splitSpaceMatcher.group().length() != 0) {
        System.out.println(splitSpaceMatcher.group().trim());
        splitEquation.add(splitSpaceMatcher.group().trim());
    }
}

Как я могу превратить это в массив, который выглядит следующим образом:

["42", "36", "23827"]

Вы можете попробовать сделать простое регулярное выражение как это:

String splitSpace = "\\d+\\s+";

Но это исключает "23827" because there is no space after it. and we only want to match if there are the same amount of x` в конце строки, как в начале

Что мы хотим в этом примере

В этом примере мы хотели бы получить регулярное выражение, которое проверяет, является ли это концом строки; если это так, то нам не нужно пространство, иначе нам это нужно. Как упомянул @YCF_L, мы могли бы просто сделать регулярное выражение \\b\\d\\b, но я стремлюсь к чему-то условному.


Заключение

Итак, в результате, вопрос есть, как мы делаем условные регулярные выражения? Спасибо за чтение и ура!

Ответы [ 3 ]

2 голосов
/ 19 января 2020

Я не вижу «условного» в вопросе. Задача разрешима с помощью прямого регулярного выражения: \b\d+\b.

regex101 demo

Полноценный Java пример будет выглядеть примерно так:

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

class Ideone {
    public static void main(String args[]) {
        final String sample = "123 45 678 90";
        final Pattern pattern = Pattern.compile("\\b\\d+\\b");
        final Matcher matcher = pattern.matcher(sample);
        final ArrayList<String> results = new ArrayList<>();
        while (matcher.find()) {
            results.add(matcher.group());
        }
        System.out.println(results);
    }
}

Вывод: [123, 45, 678, 90]

Демо Ideone

2 голосов
/ 19 января 2020

В регулярных выражениях Java нет условий.

Я хочу регулярное выражение, которое проверяет, есть ли в конце такое же количество регулярных выражений, как и в начале. Условная часть: если в начале есть x, то проверьте, есть ли их в конце, если они есть, то это совпадение.

Это может быть или не быть разрешимым. Если вы хотите знать, повторяется ли указанная c строка (или шаблон), это можно сделать, используя обратную ссылку; Например,

   ^(\d+).+\1$

будет соответствовать строке, состоящей из произвольных цифр, любого количества символов и одинаковых цифр, совпадающих в начале. Обратная ссылка \1 соответствует строке, соответствующей группе 1.

Однако, если вы хотите, чтобы в конце было то же самое число цифр, что и в начале (и это число не ' т константа), то вы не можете реализовать это с помощью одного (Java) регулярного выражения.

Обратите внимание, что некоторые языки / движки регулярных выражений поддерживают условные выражения; см. википедию Сравнение движков регулярных выражений стр.

2 голосов
/ 19 января 2020

Я хотел бы использовать split, которая принимает регулярные выражения следующим образом:

String[] split = nums.split("\\s+"); // ["42", "36", "23827"]

Если вы хотите использовать Pattern с Matcher, вы можете использовать String \b\d+\b с границами слов.

String regex = "\\b\\d+\\b";

Используя границы слов, вы избежите случаев, когда число является частью слова, например, "123 a4 5678 9b", вы получите только ["123", "4578"]

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