(?i) - case insensitive flag
\\b - word boundary
(\\w+) - 1 or more word characters (A-Z, a-z, 0-9) in a captured group
\\b - word boundary
[\\w\\W]* - 0 or more word or non-word characters
\\b - word boundary
\\1 - the group previously captured
\\b - word boundary
Вы можете посмотреть на Java tutorials для регулярных выражений. Все это объясняется там.
Многократное использование граничных
Если посмотреть на учебник Java для Boundary Matchers вы увидите, что это соответствие, то есть на границе слова. Поскольку это ищет повторяющиеся слова, он гарантирует, что совпадение действительно является целым словом, а не словами, содержащими это слово.
Case Нечувствительность
Как упомянуто Phsemo это используется для того, чтобы \\1
соответствие группа с еще совпадают, если дело обстоит иначе. i.e рассмотреть, было ли повторено первое слово в предложении.
Использование [\\w\\W]*
Опять же, как упомянута Phsemo это, вероятно, используется вместо .
(который является регулярным выражением специального символом для любого символа, за исключение того, что это не гарантировано, чтобы соответствовать новым строке символов See this. .*
может быть использован вместо этого, если также был установлен флаг dotall (?s)
), так что символы новой строки совпадают. И квантификатор *
(0 или более), так что если следующее слово является дубликатом, оно сопоставляется, а также если между дубликатами они совпадают.
Не лучше ли придумать решение, которое вы можете понять и сохранить? – millimoose
Также поиск «объяснять regexp» будет указывать на сайты, такие как [этот] (http://rick.measham.id.au/paste/explain.pl?regex=%28%3Fi%29%5Cb%28% 5Cw% 2B% 29% 5Cb% 5B% 5Cw% 5CW% 5D *% 5Cb% 5C1% 5Cb), что, честно говоря, скорее всего скажет вам то же самое, что и любые ответы на этот вопрос. (Просто убеждайтесь, что вы можете свернуть обратную косую черту, это Javaism, а не фактический синтаксис RE.) – millimoose