Возьмите текст между значением и символом .NET.

У меня есть столбец в базе данных (Sql Server), который содержит такие значения:

{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}}\f0\fs22 Negative}

где \ rtf1 \ ansi \ deff0 {\ fonttbl {\ f0 \ fnil \ fcharset0 Courier New;}} \ f0 \ fs22 - это форматирование текста (размер, шрифт ...).
Меня это не интересует.

Я хочу извлечь текст/строку Negative , но тот же столбец может содержать также:

{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}}\f0\fs22 Slightly Cloudy}

In other words, I want to grab only the text between fs22 and }

Expected results: Slightly Cloudy or Negative

Как это сделать на C# или VB.NET?

1
nl ja de

4 ответы

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

(?<=\\fs22 )[^}]+(?=})

Это будет соответствовать любому значению между \ fs22 и } , в то время как не содержит упомянутых разделителей в матче (это достигается с помощью утверждений поиска). В C# это будет выглядеть так:

var value = Regex.Match(s, @"(?<=\\fs22 )[^}]+(?=})").Value;

или в VB:

Dim value = Regex.Match(s, "(?<=\\fs22 )[^}]+(?=})").Value

Тест Quick PowerShell:

PS> '{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}}\f0\fs22 Negative}',
>> '{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}}\f0\fs22 Slightly Cloudy}' |
>> %{ [Regex]::Match($_, '(?<=\\fs22 )[^}]+(?=})') }
>>


Groups   : {Negative}
Success  : True
Captures : {Negative}
Index    : 69
Length   : 8
Value    : Negative

Groups   : {Slightly Cloudy}
Success  : True
Captures : {Slightly Cloudy}
Index    : 69
Length   : 15
Value    : Slightly Cloudy
1
добавлено
танков, это отлично работает для меня!
добавлено автор Flavius69, источник

Что случилось с использованием SubString?

string s = @"{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}}\f0\fs22 Negative}";
int i = s.LastIndexOf(@"\fs22 ");
string x = s.Substring(i + 6, s.Length - i - 6 - 1);
// 6 = length of string "\fs22 "
// 1 = minus the } at the end

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

1
добавлено
Это также намного больше кода, труднее читать и понимать (хорошо, это происходит от человека, который обычно легко читает регулярные выражения) и менее устойчив к изменениям, например. если маркер начала изменяется на \ fs122 , вам необходимо запомнить все экземпляры 6 до 7 .
добавлено автор Joey, источник
@ Flavius69 легко определить разделители в двух отдельных строках и проверить длину этих строк вместо магических чисел 6 и 7, но приведенный выше пример легче понять, и я просто дал его в качестве альтернативы решению проблемы OP, а не используя регулярное выражение.
добавлено автор Bazzz, источник
я тоже попробую этот подход, спасибо заранее
добавлено автор Flavius69, источник
хорошо, я понимаю, я тестировал и также работал, танки.
добавлено автор Flavius69, источник
все-таки я попробую оба решения с большим количеством данных и решит, что намного быстрее, но один из них решил мой вопрос, танки для всех
добавлено автор Flavius69, источник

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

(?<=fs22\s*)[^}]+(?=}$)
0
добавлено

[SOLUTION SOLVED]
'With Regular Expression

Private Function _CompareTextWithString(ByVal regexp As String, ByVal _theTextWhereToSearch As String) As String

    Dim EXPreg As System.Text.RegularExpressions.Regex

    '1º - The Regular Expression
    Dim expresaoREGULAR As String = regexp
    ' EX: "(?<=fs22\s*)[^}]+(?=}$)"

    '2º - Associate the expression to a Variavel Regex
    EXPreg = New System.Text.RegularExpressions.Regex(expresaoREGULAR, RegexOptions.IgnoreCase)
    '3º
    ' Check if matches with
    Dim check As Match = EXPreg.Match(_theTextWhereToSearch)

    If (check.Success) Then

        Return check.Value ' Matches
    Else
        Return False ' No Matches
    End If

End Function
'Usage
Private Sub _btExecRegex_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _btExecRegex.Click
    _txtResult.Text = _CompareTextWithString("(?<=fs22\s*)[^}]+(?=}$)", _
                                                "{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}}\f0\fs22 Negative}")
End Sub

'With Substring
Private Function _returnValueFromStr(ByVal _str As String, ByVal _strFilterLastIndexOf As String, ByVal _lastCharOrChars As Integer) As String
    'Last ocourence of the filter
    Dim i As Integer = _str.LastIndexOf(_strFilterLastIndexOf)
    'size of Filter
    Dim f As Integer = _strFilterLastIndexOf.Length

    'Return the value from _str wich is filtered 
    'with _strFilterLastIndexOf and at the end -1 (or -2 ...) the char i don't need

    Return _str.Substring(i + f, _str.Length - i - f - _lastCharOrChars)

End Function
'Usage
Private Sub _btExecutar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _btExecutarSubStr.Click
    _txtResult.Text = _returnValueFromStr("{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}}\f0\fs22 Negative}", _
                                             "\fs22 ", 1)
End Sub
0
добавлено
DotNetRuChat
DotNetRuChat
2 992 участник(ов)

Чат русскоязычного .NET сообщества http://dotnet.ru/ Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @xamarin_russia, @microsoftstackjobs, @uwp_ru Флуд в @dotnettalks

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

pro.net
pro.net
710 участник(ов)

Обсуждение .NET Framework и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). Флудилка: @dotnettalks Участник @proDOT

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

.NET Talks: Force Push Masters
.NET Talks: Force Push Masters
490 участник(ов)

Свободный чат .NET разработчиков. Правила: t.me/dotnettalks/56823 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @microsoftstackjobs, @uwp_ru http://combot.org/chat/-1001128250813

.NET Chat Убежище
.NET Chat Убежище
246 участник(ов)

Чат .NET разработчиков под эгидой MSK/SPB .NET Community Group Вам могут быть интересны: @fsharp_chat, @dotnetruchat, @cilchat, @xamarin_russia, @microsoftstackjobs, @dotnetgroup Флуд в @dotnettalks

.NET CIL Chat
.NET CIL Chat
54 участник(ов)

.NET CIL (aka IL aka MSIL)