powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / как удалить первое вхождение подстроки в строке с тегами
13 сообщений из 13, страница 1 из 1
как удалить первое вхождение подстроки в строке с тегами
    #38856624
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дана строка с тегами например
Код: html
1.
оди<tag1 par1>н дв</tag1>а<tag2 par2>три че </tag2>тыре


и если оторбожать без тегов то получится "один два три четрые"
и надо удалить удалить подстроку, например "два" но оставив все при этом все теги.
результат
Код: html
1.
оди<tag1 par1>н </tag1><tag2 par2> три че </tag2>тыре
...
Рейтинг: 0 / 0
как удалить первое вхождение подстроки в строке с тегами
    #38856658
F#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
F#
Гость
Вычислить строку без тегов
Найти все совпадения там
Пройти по строке с тегами вычисляя текущую позицию символа в троке без тегов и, если она попадает в совпадение, то удалять символ.
...
Рейтинг: 0 / 0
как удалить первое вхождение подстроки в строке с тегами
    #38856671
F#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
F#
Гость
Вот так у меня получилось. Попробовать можно тут http://www.tryfsharp.org/Create
По скорости не оптимизированно "что вижу то и пою"

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
open System.Text.RegularExpressions
let testString = "оди<tag1 par1>н дв</tag1>а<tag2 par2>три че </tag2>тыре д<li>в</li>а пять"
let whatToDelete = "два"
let tagPattern = new Regex("(?i)<.*?>")
let stringWithoutTags = tagPattern.Replace(testString, "")
let matchesToPairs matches = matches |> Seq.cast<Match> |> Seq.map(fun x -> (x.Index, x.Index + x.Value.Length - 1))
let forDelete = Regex.Matches(stringWithoutTags, whatToDelete) |> matchesToPairs 
let tagsPositions = tagPattern.Matches(testString) |> matchesToPairs
let inPairs pairs position = 
    pairs |> 
    Seq.exists (fun (startPosition, endPosition) -> (position >= startPosition) && (position <= endPosition))
let charactersWithPositions = testString |> Seq.mapi (fun pos char -> pos, char)
let previousTagsPositions position = tagsPositions |> Seq.takeWhile (fun x -> (fst x) < position)
let intervalLength (first, last) = last - first + 1
let positionWithoutTag position = position - (previousTagsPositions position |> Seq.sumBy intervalLength) 
let isDeleted position = inPairs forDelete (positionWithoutTag position)
let isTag position = inPairs tagsPositions position
let isGood position = (isTag position) || not (isDeleted position)
let resultSequence = 
    testString 
    |> Seq.mapi (fun pos char -> isGood pos, char) 
    |> Seq.where fst 
    |> Seq.map snd
    |> Seq.toArray
    

printf "%A" (new System.String(resultSequence))
...
Рейтинг: 0 / 0
как удалить первое вхождение подстроки в строке с тегами
    #38856713
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
F#Вычислить строку без тегов
Найти все совпадения там
Пройти по строке с тегами вычисляя текущую позицию символа в троке без тегов и, если она попадает в совпадение, то удалять символ.
точно, спасибо
...
Рейтинг: 0 / 0
как удалить первое вхождение подстроки в строке с тегами
    #38856741
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C#
Код: c#
1.
2.
3.
4.
string input = "оди<tag1 par1>н дв</tag1>а<tag2 par2>три че </tag2>тыре";
string pat = "два";
string pattern = string.Join("(<.*?>)*", pat.Select(c => c.ToString()));
string result = Regex.Replace(input, pattern, m => Regex.Match(m.Value, "<.*?>").Value);
...
Рейтинг: 0 / 0
как удалить первое вхождение подстроки в строке с тегами
    #38856778
f#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
f#
Гость
petalvikC#
Код: c#
1.
string result = Regex.Replace(input, pattern, m => Regex.Match(m.Value, "<.*?>").Value);



Я так понял, что тут оно обрабатывает ровно один разделяющий тег, надо наверное вызвать matches, а затем заджоинить их value
...
Рейтинг: 0 / 0
как удалить первое вхождение подстроки в строке с тегами
    #38856782
JS.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS.
Гость
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
//js
function rm(str, rem){
    var a=str.split(/(?=<)|>/), i=0, len=a.length, atag=[], ss= tag= '',
        re = new RegExp( rem.split('').join('(\\n?)') +'|(\n)', 'g' );
    for( ; len>i; i++ )
        if( '<'===a[i].charAt(0) ) tag+=a[i]+'>';
        else{
            if(tag){ atag.push(tag); ss+='\n'; tag='' }
            ss+=a[i]
        }
    
    return i=0, ss.replace(re, function(){
        var s='', k=0, n=arguments.length-2;
        while(++k<n) if(arguments[k]) s+=atag[i++];
        return s
    })
}
...
Рейтинг: 0 / 0
как удалить первое вхождение подстроки в строке с тегами
    #38856799
F#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
F#
Гость
Продолжая идею petalvik, только переиспользуем уже найденную информацию


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
open System.Text.RegularExpressions
let input = "оди<tag1 par1>н дв</tag1>а<tag2 par2>три че </tag2>тыре д<раз/><два>ва";
let pat = "два";
let tagPattern = "(<.*?>)*"
let replacePattern = pat |> Seq.map string |> String.concat tagPattern  
let joinCaptures (group:Group) = group.Captures |> Seq.cast<Capture> |> Seq.map (fun x -> x.Value) |> String.concat ""
let result = Regex.Replace(input, replacePattern, 
    fun (m:Match) -> 
        m.Groups 
        |> Seq.cast<Group> 
        |> Seq.skip 1 
        |> Seq.map joinCaptures 
        |> String.concat "" 
);
...
Рейтинг: 0 / 0
как удалить первое вхождение подстроки в строке с тегами
    #38856817
JS.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JS.
Гость
... что-то я перемудрил, - ТСу вообще нужно былы удавить первое вхождение )))
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//js
function rm(str, rem, cnt /* сколько вхождений удалить */){
    if (cnt|=0, cnt<1) return str;
    var re=new RegExp(rem.split('').join('(<[^>]+>)*'), 1<cnt ? 'g' : '');
    
    return str.replace(re, function(){
        if(!cnt--) return arguments[0];
        var s='', k=0, n=arguments.length-2;
        while(++k<n) if(arguments[k]) s+=arguments[k];
        return s
    })
}
...
Рейтинг: 0 / 0
как удалить первое вхождение подстроки в строке с тегами
    #38856830
F#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
F#
Гость
Если генерировать регулярное выражение, можно генерировать к нему и строку замены

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
open System.Text.RegularExpressions
let input = "оди<tag1 par1>н дв</tag1>а<tag2 par2>три че </tag2>тыре д<раз/><два>ва";
let pat = "два";
let tagPattern = "((<.*?>)*)"
let replacePattern = pat |> Seq.map string |> String.concat tagPattern  
let replaceString = seq {1 .. 2 .. ((String.length pat) - 2) * 2 + 1 } |> Seq.map (sprintf "$%d")  |> String.concat ""
let result = Regex.Replace(input, replacePattern, replaceString)
printf "%s" result
...
Рейтинг: 0 / 0
как удалить первое вхождение подстроки в строке с тегами
    #38856950
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
F#Вычислить строку без тегов
Найти все совпадения там
Пройти по строке с тегами вычисляя текущую позицию символа в троке без тегов и, если она попадает в совпадение, то удалять символ.

вот этот алгоритм считаю правильным,все остальное не подходит так как нужно делать на с++ и скорее всего без регулярных выражений.дальше буду писать сам
...
Рейтинг: 0 / 0
как удалить первое вхождение подстроки в строке с тегами
    #38857212
F#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
F#
Гость
Картежникскорее всего без регулярных выражений.дальше буду писать сам

Ну по регулярному выражению можно сделать конечный автомат и идти по исходному тексту, запоминая позиции удаляемых символов. После достижения совпадения формировать выходную строку.
...
Рейтинг: 0 / 0
как удалить первое вхождение подстроки в строке с тегами
    #38857272
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
F#Картежникскорее всего без регулярных выражений.дальше буду писать сам

Ну по регулярному выражению можно сделать конечный автомат и идти по исходному тексту, запоминая позиции удаляемых символов. После достижения совпадения формировать выходную строку.
просто у меня с регулярными выражениями не особо. боюсь что то пропустить
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / как удалить первое вхождение подстроки в строке с тегами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]