Regex - потенциальные квантификаторы, дающие ошибку [дубликат]

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

1
задан JRomeo 14 August 2015 в 21:12
поделиться

1 ответ

Наиболее очевидной проблемой является $1. В регулярном выражении вы можете ссылаться на группу # 1, используя \1, а не $1. (,$1)* в вашем регулярном выражении никогда не будет соответствовать чему-либо. Но ссылка на группу ничего не собирается делать.

Когда вы используете ссылку на группу в регулярном выражении, вы снова не применяете эту часть регулярного выражения, вы просто соответствуете тому же вещь, с которой она соответствовала в первый раз. То есть, (ACA[A-Z])(,\1)* будет соответствовать ACAA,ACAA, но не ACAA,ACAB или ACAA,ACAC. Если вы хотите это сделать, вам нужно повторить текущее регулярное выражение: (ACA[A-Z])(,ACA[A-Z])*. Поскольку вы генерируете регулярное выражение динамически, это не должно быть проблемой.

Обратите внимание, что это все регулярное выражение: ACA[A-Z](,ACA[A-Z])*. Нет необходимости сопоставлять материал, предшествующий или следующий за интересующей вас частью; это просто усложняет работу (и результаты более запутывают). Вы можете получить доступ к результату соответствия напрямую, вместо использования этого трюка «replace»:

var match = mRegex.exec(generation);
if (match != null) {
    mSiblings = match[0];
}
1
ответ дан Alan Moore 19 August 2018 в 18:13
поделиться
  • 1
    Если длина каждого элемента не фиксирована, то необходима граница слова. Если он исправлен, то текущее решение работает. – nhahtdh 15 August 2015 в 03:51
  • 2
    @nhahtdh: То, что вы говорите, верно, но OP сказал, что все участники будут одинаковой длины, и что братья и сестры будут идентичны, за исключением последней буквы. Хотя фрагменты кода и заявленные результаты сбивают с толку, фактический вопрос (около первой трети текста) ясен в этих точках. – Alan Moore 16 August 2015 в 21:41
Другие вопросы по тегам:

Похожие вопросы: