Лучший способ изменить существующее регулярное выражение Java, чтобы разрешить один новый символ

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

String regex = "^[a-zA-Z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF \\-&*()_+|~=`{}\\[\\]:\";'<>?,.]{0,900}$";

if (condition is true) { 
      regex = regex .substring(0, 47) + "/" + regex.substring(47, 
      regex.length());
}

Что вы пробовали и где вам проблематично изменить код? Есть такие сайты, как regex101.com, которые объясняют, что делает часть регулярного выражения. Вы пробовали их?

Corion 16.10.2018 11:48

Не рекомендуется динамически изменять такой шаблон. Было бы разумнее строить его из блоков. То есть определите диапазоны отдельно и поместите их в класс отрицательных символов в качестве последнего шага. И только избегайте символов, которые вы должны избегать в классах персонажей.

Wiktor Stribiżew 16.10.2018 11:49

@Corion Я загляну на этот веб-сайт для получения дополнительной информации. Но похоже, что этот сайт не поддерживает Java.

suchit 16.10.2018 12:14

@ WiktorStribiżew Я знаю, что это плохая идея, поэтому я спрашиваю, как лучше всего добавить дополнительный символ.

suchit 16.10.2018 12:15

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

Wiktor Stribiżew 16.10.2018 12:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
53
2

Ответы 2

Лучшим способом, вероятно, было бы определить их оба по отдельности, а затем использовать их на основе вашего условия if.

    String regex1 = "^[a-zA-Z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF \\-&*()_+|~=`{}\\[\\]:\";'<>?,.]{0,900}$";
    String regex2 = "^[a-zA-Z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF \\-&*()_+|~=`{}\\[\\]:\";'<>?,/.]{0,900}$";

    String currentRegex;
    if (condition is true) { 
          currentRegex = regex2;
    } else {
        currentRegex = regex1;
    }

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

suchit 17.10.2018 06:06

Вы можете использовать объединение классов символов:

String myCharclass = "[a-zA-Z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF \\-&*()_+|~=`{}\\[\\]:\";'<>?,.]"

if (condition)
    myCharclass = "[/" + charclass + "]"; // a character class union

String regex = "^" + myCharclass + "{0,900}$";

Если бы он был написан с использованием almson-regex, это выглядело бы так:

import static net.almson.util.Regex.*;

String myCharclass = charclassUnion (LETTER, DIGIT, charclassRange ('\u00A0', '\uD7FF'), charclassRange ('\uF900', '\uFDCF'), charclassRange ('\uFDF0','\uFFEF'), charclass (' ', '-', '&', '*', '(', ')', '_', '+', '|', '~', '=', '`', '{', '}', '[', ']', ':', '"', ';', '\'', '<', '>', '?', ',', '.'));

if (condition)
    myCharclass = charclassUnion (myCharclass, charclass ('/'));

regex = START_BOUNDARY + between (0, 900, myCharclass) + END_BOUNDARY;

Другие вопросы по теме