Не существует регулярного выражения, которое будет выполнять то, что вы хотите, как указывали другие ответы, но вы сказали, что хотите выучить регулярное выражение, поэтому вот еще один подход мета-регулярного выражения, который может быть учебным.
Вот фрагмент кода Java, который, учитывая строку, программно генерирует шаблон, который будет соответствовать любой подстроке этой строки длины 5.
String seq = "ABCDEFGHIJKLMNOP";
System.out.printf("^(%s)$",
seq.replaceAll(
"(?=(.{5}).).",
"$1|"
)
);
Вывод ( как виднона ideone.com ):
^(ABCDE|BCDEF|CDEFG|DEFGH|EFGHI|FGHIJ|GHIJK|HIJKL|IJKLM|JKLMN|KLMNO|LMNOP)$
Вы можете использовать это для удобного создания шаблона регулярного выражения для соответствия прямым покерным рукам, инициализируя seq
в зависимости от ситуации.
Как это работает
.
метасимвол соответствует «любому» символу (разделители строк могут быть исключением в зависимости от режима, в котором мы находимся).
The {5}
является точным повторением спецификатором..{5}
соответствует в точности 5 .
.
(?=…)
- положительный прогноз ;он утверждает, что данный шаблон может быть сопоставлен, но поскольку он является только утверждением, он фактически не выполняет (то есть потребляет) совпадение из входной строки.
Просто (…)
является захватомгруппа .Он создает обратную ссылку, которую вы можете использовать, возможно, позже в шаблоне или в подстановках, или по своему усмотрению.
Шаблон повторяется здесь для удобства:
match one char
at a time
|
(?=(.{5}).).
\_________/
must be able to see 6 chars ahead
(capture the first 5)
Шаблон работаетсопоставляя один символ .
за раз.Однако, прежде чем этот символ будет сопоставлен, мы утверждаем (?=…)
, что мы можем увидеть всего 6 символов впереди (.{5}).
, захватив (…)
в группу 1 первым .{5}
.Для каждого такого совпадения мы заменяем $1|
, то есть все, что было захвачено группой 1, с последующим метасимволом чередования.
Давайте рассмотрим, что произойдет, когда мы применим это к более короткому String seq = "ABCDEFG";
.↑
обозначает нашу текущую позицию.
=== INPUT === === OUTPUT ===
A B C D E F G ABCDE|BCDEFG
↑
We can assert (?=(.{5}).), matching ABCDEF
in the lookahead. ABCDE is captured.
We now match A, and replace with ABCDE|
A B C D E F G ABCDE|BCDEF|CDEFG
↑
We can assert (?=(.{5}).), matching BCDEFG
in the lookahead. BCDEF is captured.
We now match B, and replace with BCDEF|
A B C D E F G ABCDE|BCDEF|CDEFG
↑
Can't assert (?=(.{5}).), skip forward
A B C D E F G ABCDE|BCDEF|CDEFG
↑
Can't assert (?=(.{5}).), skip forward
A B C D E F G ABCDE|BCDEF|CDEFG
↑
Can't assert (?=(.{5}).), skip forward
:
:
A B C D E F G ABCDE|BCDEF|CDEFG
↑
Can't assert (?=(.{5}).), and we are at
the end of the string, so we're done.
Итак, мы получаем ABCDE|BCDEF|CDEFG
, которые являются всеми подстроками длины 5 из seq
.
Ссылки