заменить текст в строке на .net регулярное выражение - PullRequest
2 голосов
/ 11 октября 2010

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

myString = "это пример моего текста, который я хочу изменить <# somevalue #> и <#anothervalue #> "

Как найти текст с токенами между" <# "и" #> "и для каждого из них сделать что-то для его замены (выполнить поиск в базе данных и заменить любой из найденныхсоответствует)?

результат, который я хочу:

myString = "это пример моего текста, который я хочу изменить someValueFromDb и anotherValueFromDb"

Спасибо.

Ответы [ 4 ]

3 голосов
/ 11 октября 2010

Ниже приведен пример использования Regex.Replace, который использует MatchEvaluator для выполнения замены путем проверки в словаре указанного токена. Если токен отсутствует в словаре, текст остается прежним.

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace TokenReplacement
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = "this is a example of my text that I want to change <#somevalue#> and <#anothervalue#>";

            var tokens = new Dictionary<string, string>
            {
                { "somevalue", "Foo" },
                { "anothervalue", "Bar" }
            };

            Console.WriteLine(Replace(text, tokens));
        }

        static string Replace(string input, Dictionary<string, string> tokens)
        {
            MatchEvaluator evaluator = match =>
            {
                string token;
                if (tokens.TryGetValue(match.Groups[1].Value, out token))
                    return token;

                return match.Value;
            };

            return Regex.Replace(input, "<#(.*?)#>", evaluator);
        }
    }
}
1 голос
/ 12 октября 2010

Спасибо за все ответы, я нашел ответ на Замените токены на странице aspx при загрузке , это именно то, что мне нужно

Спасибо за ссылки и примеры, которые указывают мне правильное направление.

private string ParseTagsFromPage(string pageContent)
    {
        string regexPattern = "{zeus:(.*?)}"; //matches {zeus:anytagname}
        string tagName = "";
        string fieldName = "";
        string replacement = "";
        MatchCollection tagMatches = Regex.Matches(pageContent, regexPattern);
        foreach (Match match in tagMatches)
        {
            tagName = match.ToString();
            fieldName = tagName.Replace("{zeus:", "").Replace("}", "");
            //get data based on my found field name, using some other function call
            replacement = GetFieldValue(fieldName); 
            pageContent = pageContent.Replace(tagName, replacement);
        }
        return pageContent;
    }
1 голос
/ 11 октября 2010

Вы хотите использовать метод Regex.Replace, который принимает делегата MatchEvaluator.Этот делегат позволит вам динамически предоставлять заменяющий текст.

Regex.Replace(yourString, @"\<\#([^#]+)\#\>", delegate(Match match)
    {
       // Your code here - use match.ToString()
       // to get the matched string
    });
0 голосов
/ 11 октября 2010

Раствор 1

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

http://www.simple -talk.com / DotNet / asp.net / regular-expression-based-token-replacement-in-asp.net /

Решение 2

Если вы не хотите добавлять столько кода, вот другой подход. Этот код ищет токены (отформатированные как # MyName #) в разделе конфигурации AppSettings файла. Я использовал аналогичный подход в другом проекте для поиска их в ресурсах и базе данных (или всех 3 с определенным приоритетом). Вы можете изменить формат своих токенов, если хотите, изменив регулярное выражение и строки замены строк.

Конечно, это можно настроить для повышения производительности, используя регулярные выражения во всем.

Public Shared Function ProcessConfigurationTokens(ByVal Source As String) As String
    Dim page As Page = CType(Context.Handler, Page)
    Dim tokens() As String = GetConfigurationTokens(Source)
    Dim configurationName As String = ""
    Dim configurationValue As String = ""

    For Each token As String In tokens
        'Strip off the # signs
        configurationName = token.Replace("#"c, "")

        'Lookup the value in the configuration (if any)
        configurationValue = ConfigurationManager.AppSettings(configurationName)

        If configurationValue.Contains(".aspx") OrElse configurationValue.Contains("/") Then
            Try
                Source = Source.Replace(token, page.ResolveUrl(configurationValue))
            Catch
                Source = Source.Replace(token, configurationValue)
            End Try
        Else
            'This is an optimization - if the content doesn't contain
            'a forward slash we know it is not a url.
            Source = Source.Replace(token, configurationValue)
        End If
    Next

    Return Source
End Function

Private Shared Function GetConfigurationTokens(ByVal Source As String) As String()
    'Locate any words in the source that are surrounded by # symbols
    'and return the list as an array.
    Dim sc As New System.Collections.Specialized.StringCollection

    Dim r As Regex
    Dim m As Match

    If Not String.IsNullOrEmpty(Source) Then

        r = New Regex("#[^#\s]+#", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
        m = r.Match(Source)
        While m.Success

            sc.Add(m.Groups(0).Value)

            m = m.NextMatch
        End While

        If Not sc.Count = 0 Then
            Dim result(sc.Count - 1) As String
            sc.CopyTo(result, 0)

            Return result
        End If
    End If

    Return New String() {}

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