Узор java: на 2 символа меньше, чем в n раз, а сумма их происхождения тоже меньше, чем n - PullRequest
1 голос
/ 17 марта 2020

Я хочу найти, если строка начинается с одного символа (между 1 и 9 вхождениями) и вторым символом (между 1 и 9 вхождениями тоже), но их сумма появления должна быть (точно) 10, общая сумма должна быть 10. Номер первого символа + Номер второго символа = 10.

Я хочу знать, возможно ли это сделать за один раз, или если это невозможно: если я должен сделать это за 2 раза.

Мой первый символ - пробел: "\ s" Мой второй символ - число, но не 0: [1-9] [0-9] *

Но вы можете объяснить это с помощью символа a и b, я адаптирую его после.

String w = "         1"          //ok
String x = " 123456789"          //ok
String z = "  123456789"         //must be not ok (11 char)
String y = "         123456789"  //must be not ok

Pattern my_pattern = patter.compile("^\\s+[1-9][0-9]*");
Pattern my_pattern2 = patter.compile("^\\s{1,9}[1-9][0-9]{1,9}");

my_pattern не годится, он допустил слишком много паттернов.

my_pattern2 сделал ограничение на количество пробелов и число ди git, но не на сумму, как я могу это сделать?

Решение состоит в том, чтобы написать 9 вариантов, как это:

Pattern my_pattern3 = patter.compile("(a{1}b{9}|a{2}b{8}|a{3}b{7}|etc)");

но я бы предпочел общее решение, если оно у вас есть.

Спасибо за внимание

1 Ответ

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

Привет, Жюль, и добро пожаловать в переполнение стека!

TLDR; Ответ, который вы уже дали, - единственный способ сделать это с помощью регулярного выражения

. Чтобы ответить на ваш вопрос, нам нужно поговорить о регулярных выражениях, которые класс java Pattern использует для сопоставления. текстовые строки (википедия здесь ). Регулярные выражения могут соответствовать только небольшому классу шаблонов, называемых регулярными языками. Они, как известно, не могут быть использованы для проверки соответствия скобок:

(((())())())() <-- Like this

Проблема, с которой мы здесь сталкиваемся, состоит в том, что регулярные выражения не могут проверять, есть ли одинаковое число чего-либо (то есть, открытие и закрытие) скобки). Это очень похоже на вашу проблему проверки того, что две длины в сумме составляют десять. Однако, поскольку в вашем случае существует конечное число возможностей (в отличие от соответствующих скобок), это можно сделать, но только перечисляя все возможные случаи, как вы уже сделали. Боюсь, нет лучшего способа сделать это с помощью регулярных выражений.

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