Как сопоставить повторяющиеся узоры? - PullRequest
18 голосов
/ 19 января 2011

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

some.name.separated.by.dots

Но я понятия не имею, как.

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

 \w+\.

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

Ответы [ 4 ]

22 голосов
/ 19 января 2011

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

\w+(\.\w+)+

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

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

EDIT

Разница между [...] и (...) заключается в том, что [...] всегда соответствует одному символу. Это называется «набор символов» или «класс символов». Таким образом, [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

РЕДАКТИРОВАТЬ 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 голосов
/ 19 января 2011

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

(\w+(\.|$))+
0 голосов
/ 19 января 2011

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

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

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

0 голосов
/ 19 января 2011
(\w+\.)+

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...