Regex & Swift: Как подавить все подстроки в строке между двумя конкретными строками? - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь подавить подстроку в строке между двумя конкретными строками, # ************************************************************ а также # ------------------------------------------------------------ например?

...
    # ************************************************************
    # Sequel Pro SQL dump
    # Version 4541
    #
    # http://www.sequelpro.com/
    # https://github.com/sequelpro/sequelpro
    #
    # Hôte: gmp2.newtelapps.fr (MySQL 5.5.62-0+deb8u1)
    # Base de données: GMP
    # Temps de génération: 2019-01-23 16:27:04 +0000
    # ************************************************************


    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
    /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
    /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
    /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;


    # Affichage de la table Table_boolean
    # ------------------------------------------------------------
...

Другой пример:
Базовая строка: "12345678 <--- текст для удаления ---> azertyui"

Результат: "12345678azertyui"

Я хотел бы создатьфункция как это:

self.removeSubString(inString: Str, fromString:"<---", toString:"--->", includingFromAndToString:YES)

Это может позволить мне стереть точную подстроку, которую я хочу удалить в строке.

Заранее спасибо.

РЕДАКТИРОВАТЬ:
Я положил здесь окончательное решение:

let result = self.removeSubStringIn(mainStr: str, fromStr: "\\# \\*{60}", toStr: "\\# -{60}", includingFromAndTo: true)

  func removeSubStringIn(mainStr:String, fromStr:String, toStr:String, includingFromAndTo:Bool) -> String?
    {
        var pattern = ""
        if (includingFromAndTo)
        {
            pattern = "(?s)(\(fromStr))(.+?)(\(toStr))"
        }
        else
        {
            pattern = "(?s)(?<=\(fromStr))(.+?)(?=\(toStr))"
        }
        var regex = try? NSRegularExpression(pattern: pattern, options: .caseInsensitive)

        let result = regex!.stringByReplacingMatches(in: mainStr,
                                                     range: NSRange(location: 0, length: mainStr.count),
                                                     withTemplate: "")

        return result
    }

1 Ответ

0 голосов
/ 29 января 2019

Например, вы можете удалить слово " World ", перед которым стоит хэштег, за которым следуют пробел и шестьдесят звезд, а за ним следует хэштег, за которым следуют пробел и шестьдесят знаков минус:

let str = "hello# ************************************************************World# ------------------------------------------------------------!"

let regex = try! NSRegularExpression(pattern: "(?<=\\# \\*{60}).+?(?=\\# -{60})")

let result = regex.stringByReplacingMatches(in: str,
                               range: NSRange(location: 0, length: str.count),
                               withTemplate: "")

print(result)

Какие выходы:

привет # ************************************************************ # ------------------------------------------------------------!

В регулярном выражении используется:

  • Положительный взгляд назад (?<=)
  • Положительный взгляд вперед (?=)

Если выкак и для удаления текста в середине, используйте следующее регулярное выражение:

let regex2 = try! NSRegularExpression(pattern: "\\# \\*{60}.+?\\# -{60}")

let result2 = regex2.stringByReplacingMatches(in: str,
                               range: NSRange(location: 0, length: str.count),
                               withTemplate: "")

print(result2)  //hello!

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

let str = "12345678<---text to remove--->azertyui"

let regex = try! NSRegularExpression(pattern: "(?<=12345678).+?(?=azerty)")

let result = regex.stringByReplacingMatches(in: str,
                               range: NSRange(location: 0, length: str.count),
                               withTemplate: "")

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