RegEx - двойное условие, чтобы найти строку - PullRequest
0 голосов
/ 06 февраля 2019

Я хотел бы найти слово RADU3_ или RADU3- в предложении, которое начинается с xlink:href= и заканчивается .svg

Как это сделать?Я попробовал следующее, но не дает ожидаемого результата.

(? = \ W xlink: href = | \ w svg \ b) | \bRADU3_ | \ bRADU3-

Хороший результат - только последняя строка в примере (RADU3_)

ProductionGraphics \ GP1 ** RADU3 - ** 11_HeatingFurnaceF1.svg PB: ExpressionText id =PBD "RADU3_FUEL GAS _SUM_EX": LinkUses xlink: href = "C: \ ProcBookImport \ MaintenanceGraphics \ RADU3_AI.svg"

Пример ...

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Звучит так, будто вам нужно только слово (подстрока), если оно находится в определенном контексте?

В вашем случае вы можете перезапустить регулярное выражение на полпути, если вы хотите иметь начальные и конечные условия (несколько условий) для строки, но в то же время хотят использовать эти условия только как «операторы if», а не как часть результата.

Следующий метод использует этот метод и использует перезапуски (\K), чтобы извлечь только искомую подстроку.

# The string has to start with "xlink:href="
xlink:href=
# Fetch everything up to our match, and the restart the regex
.*\K
# The strings we are looking for 
(RADU3[-_])
# String has to end with ".svg" 
(?=(.*\.svg))

Если вы хотите, чтобы вся строка соответствовала нашим правиламвы ищете что-то вроде этого:

#The string has to start with "xlink:href"
^(xlink:href=).*
# The strings we are looking for 
(RADU3[-_])
# String has to end with ".svg" 
(\w+\.svg)
#Get everything after .svg too
.*

Если вы хотите, чтобы окончание " только после .svg, вы хотели бы изменить последнюю часть, где я просто взять все после .svg

Вы можете поиграть с тем, что я придумал на regex101 (без принадлежности, просто люблю их сайт): https://regex101.com/r/g0v07V/3/

0 голосов
/ 06 февраля 2019

Если вы хотите убедиться, что строка начинается с xlink:href= и заканчивается \.svg, вы можете использовать якоря для подтверждения начала ^ и конца $ строки.

Используйте 1 группу захвата, чтобы убедиться, что xlink:href= предшествует RADU3, за которым следует знак подчеркивания или дефис.Затем вы можете сопоставить его, и в замене использовать эту группу захвата, следующую за вашей заменой.

Вы можете использовать положительный прогноз, чтобы утверждать, что строка заканчивается на \.svg

Это будет соответствовать:

^(xlink:href=.*)\bRADU3[_-](?=.*\.svg$)
  • ^ Утверждение начала строки
  • (xlink:href=.*) Группа захвата, соответствует до последнего вхождения ..
  • \bRADU3[_-] Граница слова, чтобы предотвратить соответствие части большего слова.Совпадение с RADU3, за которым следует подчеркивание или дефис
  • (?=.*\.svg$) Позитивный взгляд на утверждение строки заканчивается на .svg

См. Демонстрационный пример regex

0 голосов
/ 06 февраля 2019

Не знаю точно, как вы хотите его использовать, но приведенный ниже шаблон находит строку.Я помещаю деталь RADU3 в группу, в которой я сопоставляю RADU3, за которой следует - или _ ([_-])

(xlink:href=.*)(RADU3[_-]*)(.*\.svg)

Редактировать, обрабатывать несколько случаев

Если строка может содержать шаблон несколько раз, используйте ?, чтобы позволить группе повториться

(RADU3[_-]*?)(.*?\.svg?)

Вышеприведенное можно использовать в выражении замены, например

\1someotherword\3

Где \ 2 - вторая группа, которая заменяется

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