2013-10-14 2 views
1

Я смотрел на алгоритм «duplicate words», и я нашел solution который использовал следующее regex.Объяснить следующие RegEx

(?i)\\b(\\w+)\\b[\\w\\W]*\\b\\1\\b

Я попытался интерпретировать RegEx используя следующий сайт http://public.kvalley.com/regex/regex.asp, но я с трудом .. Может кто-то разбивку регулярное выражение для меня и объяснить это мне?

+0

Не лучше ли придумать решение, которое вы можете понять и сохранить? – millimoose

+2

Также поиск «объяснять 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

ответ

9
(?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 или более), так что если следующее слово является дубликатом, оно сопоставляется, а также если между дубликатами они совпадают.

+2

Nice and simple +1. Также '[\\ w \\ W]', вероятно, использовался вместо '.', чтобы также соответствовать новому символу строки. Кроме того, если кто-то задается вопросом, почему '' (? I) 'используется здесь, то пусть' \\ 1' соответствует группе один символ, нечувствительный к регистру. – Pshemo

+0

Иногда на языках я вижу такие вещи, как '/ regex/i' для нечувствительных к регистру. Будут ли эти же языки использовать '/ (? I) regEx /' в качестве синонима? В чем разница между ними? –

+0

Возможно ли, если вы можете объяснить, почему '\ b' использовался несколько раз? почему '[w \ W]' используется и т. д.? –

Смежные вопросы