Существует два способа решения этой проблемы:
- Понять регулярное выражение (намного сложнее, чем необходимо) и исправить его в соответствии с вашими требованиями (возможно, с ошибками)
- Кому интересно, как регулярное выражение делает свое дело (кажется, оно делает то, что вам нужно) и изменяет ваш вклад, чтобы соответствовать тому, что вы думаете, регулярное выражение делает
Второй подход означает, что вы просто проверяете, заканчивается ли входная строка \
. Если этого не произойдет, просто добавьте его, и пусть регулярное выражение сделает это волшебным.
Обычно я бы не рекомендовал эту невежественную альтернативу, но это может быть исключением.
Blackboxing
Вот как я «решаю» эту проблему:
- Есть волшебная коробка, которая знает, как она работает, но работает 99% времени
- Мы хотим, чтобы это работало 100% времени
- Проще исправить 1%, чтобы он работал с волшебной коробкой, а не исправлять саму волшебную коробку (потому что это потребовало бы понимания того, как работает волшебная коробка)
- Тогда просто исправьте 1% вручную и оставьте волшебную коробку в покое
Расшифровка чёрной магии
Тем не менее, мы, конечно, можем попытаться взглянуть на регулярное выражение. Вот тот же шаблон, но переформатированный в режиме свободного пробела / комментария, т.е. (?x)
, например. Java.
^
( [A-Za-z]:
| \\{2} ( [-\w]+
| (
(25[0-5]
|2[0-4][0-9]
|[01]?[0-9][0-9]?
)\.
){3}
(25[0-5]
|2[0-4][0-9]
|[01]?[0-9][0-9]?
)
)
\\ (
( [^"*/:?|<>\\,;[\]+=.\x00-\x20]
| \.[.\x20]* [^"*/:?|<>\\,;[\]+=.\x00-\x20]
)
( [^"*/:?|<>\\,;[\]+=\x00-\x1F]*
[^"*/:?|<>\\,;[\]+=\x00-\x20]
)?
)
)
\\ (
[^"*/:?|<>\\.\x00-\x20]
(
[^"*/:?|<>\\\x00-\x1F]*
[^"*/:?|<>\\.\x00-\x20]
)?
\\
)*
$
Основной каркас шаблона выглядит следующим образом:
^
(head)
\\ (
bodypart
\\
)*
$
Исходя из этого высокоуровневого представления, похоже, что дополнительный трейлинг \
может быть поддержан путем добавления ?
к двум \\
после части (head)
:
^
(head)
\\?(
bodypart
\\?
)*
$
Ссылки
Примечание о катастрофическом возврате
Как правило, вы должны очень опасаться вложенных модификаторов повторения (в данном случае ?
внутри *
), но для этого конкретного шаблона это "хорошо", потому что bodypart
не не соответствует \
.
Ссылки