Как сопоставить повторяющиеся шаблоны?

Я хотел бы соответствовать:

some.name.separated.by.dots

Но я понятия не имею, как это сделать.

Я могу сопоставить одну часть, подобную этой

 \w+\.

Как я могу сказать "повторить это"

Ответ 1

Попробуйте следующее:

\w+(\.\w+)+

+ после ( ... ) указывает, что он соответствует тому, что находится внутри круглой скобки один или несколько раз.

Обратите внимание, что \w соответствует только символам ASCII, поэтому слово, подобное café, не будет соответствовать \w+, не говоря уже о словах/текстах, содержащих Unicode.

ИЗМЕНИТЬ

Разница между [...] и (...) заключается в том, что [...] всегда соответствует одному символу. Он называется "набор символов" или "класс символов". Таким образом, [abc] соответствует не строке "abc", но соответствует одному из символов a, b или c.

Тот факт, что \w+[\.\w+]* также соответствует вашей строке, состоит в том, что [\.\w+] соответствует символу . или символу из \w, после чего после него повторяется ноль или больше времени *. Но, \w+[\.\w+]* будет также соответствовать строкам типа aaaaa или aaa............

(...), как я уже упоминал, просто используется для группировки символов (и, возможно, повторения этих групп).

Дополнительная информация о наборах символов: http://www.regular-expressions.info/charclass.html

Дополнительная информация о группах: http://www.regular-expressions.info/brackets.html

EDIT II

Вот пример в Java (видя, что вы отправляете в основном ответы Java):

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String text = "some.text.here only but not Some other " + 
                "there some.name.separated.by.dots and.we are done!";
        Pattern p = Pattern.compile("\\w+(\\.\\w+)+");
        Matcher m = p.matcher(text);
        while(m.find()) {
            System.out.println(m.group());
        }
    }
}

который будет производить:

some.text.here
some.name.separated.by.dots
and.we

Обратите внимание, что m.group(0) и m.group() эквивалентны: это означает "полное совпадение".

Ответ 2

Это также будет работать:

(\w+(\.|$))+

Ответ 3

Вы можете использовать ? для соответствия 0 или 1 предыдущим частям, *, чтобы соответствовать 0 для любого количества предшествующих частей, и + для соответствия хотя бы одной из предшествующих частей.

Итак, (\w\.)? будет соответствовать w. и пробел (\w\.)* будет соответствовать r.2.5.3.1.s.r.g.s. и пробел, а (\w\.)+ будет соответствовать любому из указанных выше, но не пустому.

Если вы хотите сопоставить что-то вроде вашего примера, вам нужно сделать (\w+\.)+, что означает "совпадение по крайней мере одного непробелкового пространства, затем периода и совпадения хотя бы одного из них".

Ответ 4

(\w+\.)+

По-видимому, тело должно быть не менее 30 символов. Надеюсь, этого достаточно.