Я хотел бы соответствовать:
some.name.separated.by.dots
Но я понятия не имею, как это сделать.
Я могу сопоставить одну часть, подобную этой
\w+\.
Как я могу сказать "повторить это"
Я хотел бы соответствовать:
some.name.separated.by.dots
Но я понятия не имею, как это сделать.
Я могу сопоставить одну часть, подобную этой
\w+\.
Как я могу сказать "повторить это"
Попробуйте следующее:
\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
Вот пример в 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()
эквивалентны: это означает "полное совпадение".
Это также будет работать:
(\w+(\.|$))+
Вы можете использовать ?
для соответствия 0 или 1 предыдущим частям, *
, чтобы соответствовать 0 для любого количества предшествующих частей, и +
для соответствия хотя бы одной из предшествующих частей.
Итак, (\w\.)?
будет соответствовать w. и пробел (\w\.)*
будет соответствовать r.2.5.3.1.s.r.g.s. и пробел, а (\w\.)+
будет соответствовать любому из указанных выше, но не пустому.
Если вы хотите сопоставить что-то вроде вашего примера, вам нужно сделать (\w+\.)+
, что означает "совпадение по крайней мере одного непробелкового пространства, затем периода и совпадения хотя бы одного из них".
(\w+\.)+
По-видимому, тело должно быть не менее 30 символов. Надеюсь, этого достаточно.