Java: соответствует Regex, если не заканчивается произвольным суффиксом - PullRequest
0 голосов
/ 05 июля 2018

Что я хочу сделать:

Используя Java, я хочу сопоставить шаблон RegEx, если за соответствием не следует сразу после суффикса «яд».

Exemples:

 "legitString" RETURNS "legitString"

 "legitString blabla" RETURNS "legitString"

 "legitString PoisonousSuffix" RETURNS "legitString"

 "legitStringPoisonousSuffix" RETURNS no match

Мой вариант использования:

Мне нужно проанализировать как можно больше ссылок из файла, следуя определенному шаблону. Но некоторые строки файла усекаются и не всегда имеют одинаковую длину (!).

К счастью, когда это происходит, строка заканчивается на «>>». Я должен предположить, что ссылка урезана, и я должен отказаться от нее. Так что ">> $" будет ядовитым суффиксом в моем случае. С другой стороны, если ">>" находится в середине текста, я должен безопасно извлечь ссылку, как обычно. (Ссылка заканчивается цифрами, но число цифр может отличаться каждый раз, поэтому я не могу это использовать.)

Так что в моем случае:

"REF" RETURNS "REF"

"REF >>" RETURNS "REF"

"REF>>" RETURNS nothing

"REF>> bla " RETURNS "REF" // because in my case, the poison is only poisonous if in the end

Я видел: https://stackoverflow.com/tags/regex/info Но я попробовал синтаксис

myRegex(?!>>$)

и это выглядит неправильно. Он обрезает последнюю правильную цифру ссылки, когда строка заканчивается на «>>», что является худшим сценарием: поврежденная ссылка проходит.

Я видел: Регулярное выражение для строки, не заканчивающейся данным суффиксом , но:

myRegex(?:(?!>>).).$

отклоняет законные ссылки.

Мое точное выражение (без яда):

   \b(SWN-)?WZ-SB\d{2}(-\d{2}){2}-[A-Z]?\d* 

должен вернуть SWN-WZ-SB00-49-03-C11 для:

"SWN-WZ-SB00-49-03-C11>> bla"

"SWN-WZ-SB00-49-03-C11 >>  "

"SWN-WZ-SB00-49-03-C11 >>"

"SWN-WZ-SB00-49-03-C11 >> bla"

и ничего для:

"SWN-WZ-SB00-49-03-C11>>"

Бонус

Есть ли способ обобщить и использовать функцию, принимающую regexPattern и toxicousSuffix и возвращающую safeRegexPattern?

Спасибо

1 Ответ

0 голосов
/ 05 июля 2018

Правильный способ сделать это - использовать условные выражения. Вот образец, который я использовал.

(?(?![\w-]+>>$)(?:([^\s>]*)(?:.*))|([^\w\W]))

Я предоставлю вам разбивку:

(?...) является if условным

(?![\w-]+>>$) проверяет, содержит ли строка ядовитый суффикс

(([^ \n>]*)(?:.*)) захватывает все, пока вы не столкнетесь с пробелом или>

| ИЛИ

([^\w\W]) ничего не захватывает.

Таким образом, синтаксис условного оператора if (? If (условие) then | else). Что делает этот шаблон, если строка не содержит суффикса, возвращает строку до первого пробела, но если это так, ничего не соответствует.

Демо

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