Регулярное выражение для удаления ссылки в строке в Swift

У меня есть набор строк, которые я получаю от службы, и мне нужно изменить текст, чтобы извлечь и удалить 3 типа ссылок, как указано ниже.

anchor - [anchor:info]Account Details[/anchor]
action -  [action:contact]Contact info[/anchor]
link-to - [link-to:register]Create An Account[/link-to]

Пример полного текста из сервиса:

  1. "Возникла проблема с вашим [anchor:info]Account Details[/anchor]."
  2. "Возникла проблема с вашим [anchor:rewards]Sign Up For Rewards[/anchor]."
  3. «Мы не узнали эту учетную запись. Введите свой адрес электронной почты еще раз или [link-to:register]Create An Account[/link-to]».

И ожидаемый результат должен быть:

  1. «Возникла проблема с данными вашей учетной записи».
  2. «Возникла проблема с вашей подпиской на вознаграждения».
  3. «Мы не узнали эту учетную запись. Введите адрес электронной почты еще раз или создайте учетную запись».

Я решил, что для этого воспользуюсь функцией replaceacingOccurrences. Но я не взломал регулярное выражение для нужного мне формата.

let aString = "There's a problem with your [anchor:info]Account Details[/anchor]."
let newString = aString.replacingOccurrences(of: "regex here", with: " ", options: .regularExpression, range: nil)

У меня может быть 3 отдельных регулярных выражения для соответствия 3 случаям или одно регулярное выражение, которое может обрабатываться ниже:

[any_link_type:any_identifier]Any Text[/any_link_type]

Могут ли мне с этим помочь какие-нибудь гуру регулярных выражений?


person Kiran Balegar    schedule 10.04.2019    source источник


Ответы (3)


Попробуйте этот шаблон ^([^[]+)\[([^:\]]+)[^\]]*\]([^[]+)\[\/\2\]

И замените его на \1\3.

Объяснение:

^ - начало строки

([^[]+) - сопоставить один или несколько символов, кроме [, и сохранить в группе захвата

\[ - совпадать [ буквально

([^:\]]+) - сопоставить один или несколько символов, кроме : или ], и сохранить в группе захвата

[^\]]* - соответствует нулю или более символов, кроме ]

\] - совпадать ] буквально

([^[]+) - сопоставить один или несколько символов, кроме [, и сохранить в группе захвата

\[\/ - совпадать [/ буквально

\2 - соответствует тому же тексту, что и во второй группе захвата (так что он соответствует закрывающему тегу, например anchor)

\] - совпадать ] буквально

Демо

person Michał Turczyn    schedule 10.04.2019

Понятно :) это регулярное выражение будет работать по моему требованию: \ [. *? \]

let linkString = "We didn't recognize this account. Please re-enter your email or [link-to:register]Create An Account[/link-to]."

let newLinkString = linkString.replacingOccurrences(of: "\\[.*?\\]", with: "", options: .regularExpression, range: nil)
person Kiran Balegar    schedule 10.04.2019

Используйте следующий код, чтобы получить ожидаемый результат.

Swift 4: -

let aString = "There's a problem with your [anchor:info]Account Details[/anchor]."
let newString = aString.replacingOccurrences(of: "\\[.*?\\]", with: "", options: .regularExpression, range: nil)
print(newString) //There's a problem with your Account Details.

Swift 5: -

let aString = "There's a problem with your [anchor:info]Account Details[/anchor]."
let newString = aString.replacingOccurrences(of: #"\[.*?\]"#, with: " ", options: .regularExpression, range: nil)
print(newString) //There's a problem with your Account Details.
person AtulParmar    schedule 10.04.2019