如何使用正则表达式匹配从 xml 文件中搜索和替换包含占位符标记的文本。 VB.net 或 C#

     2023-04-13     173

关键词:

【中文标题】如何使用正则表达式匹配从 xml 文件中搜索和替换包含占位符标记的文本。 VB.net 或 C#【英文标题】:How do I search and replace text containing placeholder tokens with a values from an xml file using regular expression matching. VB.net or C# 【发布时间】:2018-05-17 01:00:55 【问题描述】:

我有一个问题需要 vb.net 或 C# 解决方案与正则表达式匹配。 我对正则表达式不太擅长,所以我想我会寻求帮助。 我有一些包含一个或多个标记的文本,我需要用从 xml 文件中检索到的值替换这些标记。令牌是相似的,但有两种不同的类型。对于第一种类型的匹配,我将用 file1.xml 中的值替换,对于第 2 种类型的匹配,我将从 file2.xml 中替换。

可替换标记的格式如下:

类型 1 令牌:&*T1&&*T1001&

类型 2 令牌:&*SomeValue&&*A2ndValue&

类型 1 令牌的替换值在 File1.xml 中,类型 2 令牌的替换值在 File2.xml 中

在上面的示例中,当找到类型 1 (T1000) 的匹配项时,我需要将整个令牌 (&*T1000&) 替换为 File1.xml 中元素 T1000 的值。 <T1000>ValueT1000</T1000>

在 2nd Type 中:当找到 Type 2 (SomeValue) 的匹配项时,我需要将整个令牌 (&*SomeValue&) 替换为 File2.xml 中 Element SomeValue 的值。 <SomeValue>Value2</SomeValue>

输入文本示例: 这是一些带有第一个标记 &T1& 和第二个标记 &*T1001& 以及更多标记 &*SomeValue& 和更多 &*A2ndValue& 的文本。

到目前为止,在 pirs 的代码的帮助下,在 vb.net 中,我有这个:

Public Shared Sub Main()
    Dim pattern As String = "\&\*?([\w]+)\&"
    Dim input As String = "This is some text with first token &*T1& and the second token &*T1001& and more tokens &*SomeValue& and still more &*A2ndValue&."
        For Each m As Match In Regex.Matches(input, pattern)
            Console.WriteLine("'0' found at index 1.", m.Groups(1).Value, m.Index)
        Next
End Sub

返回:

'T1' found at index 35.
'T1001' found at index 62.
'SomeValue' found at index 87.
'A2ndValue' found at index 115

我需要处理此文本并将所有标记替换为从 2 个 xml 文件中检索到的值。 任何帮助表示赞赏。

[编辑] 来自@pirs的回答。也许这样做的方法是首先找到 T1000 类型的匹配项,然后用匹配的正则表达式索引替换。按索引替换时,我想我必须从最后一个索引开始,因为每次替换都会更改匹配的索引。 在替换所有 T1000 匹配项后,我想我可以对上面的输出字符串进行另一个匹配,然后替换所有 2nd 类型的匹配项。

什么是 T1000 的正则表达式匹配(T 后跟任意位数)

【问题讨论】:

你的要求不是很好。无法弄清楚你想要什么,但你不应该用正则表达式来做这件事。使用 XElement 或 XmlElement 有更好的方法。 @jdweng 我编辑并澄清了这个问题。 【参考方案1】:

[EDIT]替换为索引so..

    public static string ReplaceIndex(this string self, string OldString, string newString, int index)        
    
        return self.Remove(index, OldString.Length).Insert(index, newString); 
    
  // ...
  s = s.ReplaceIndex(m.Groups(1).Value, "newString", m.Index)
  // ...

[EDIT]尝试直接替换值

// ...
s = s.Replace(m.Groups(1).Value, "newValue")
// ...

[编辑] &*& 的正则表达式:https://regex101.com/r/MVRS7U/1/

为 c# 生成的正则表达式函数

using System;
using System.Text.RegularExpressions;

public class Example

    public static void Main()
    
        string pattern = @"&\*?([^&\*\d]+)";
        string input = @"&*cool&*it's&working&in&*all&case";

        foreach (Match m in Regex.Matches(input, pattern))
        
            Console.WriteLine("'0' found at index 1.", m.Value, m.Index);
        
    

现在应该没问题了:-)

__

我不确定您到底想要什么,但这里有适合您情况的正则表达式:https://regex101.com/r/5i3RII/1/

在这里,为 c# 生成的正则表达式函数(你应该做一个自定义函数来满足你的需要..):

using System;
using System.Text.RegularExpressions;

public class Example

    public static void Main()
    
        string pattern = @"<[a-zA-Z-0-9]+\s?>([\w]+)<\/[a-zA-Z-0-9]+\s?>";
        // the example you gave
        string input = @"<T1>value1</T1>
            <T1001>value2</T1001>
            <T2000 />
            <SomeValue>value1</SomeValue >
            <A2ndValue>value2</A2ndValue >";

        foreach (Match m in Regex.Matches(input, pattern))
        
            // the output
            Console.WriteLine("'0' found at index 1.", m.Value, m.Index);
        
    

【讨论】:

谢谢。除了要匹配的正则表达式模式之外,您的回答不是 xml。我需要匹配的正则表达式模式是:&*T1& 或 &*T1000& 等。它以 &*T 开头,后跟任意整数,以 & 结尾。找到匹配项后,我需要提取到字符串 T1、T1000 等。在第二种情况下,我需要匹配 &*SomeValue&。正则表达式模式也可以与上述相同。然后我需要知道哪个 m.value 是 Type 1 (T1000),哪个是 Type 2 (SomeValue)。这是因为我的代码将从 File1.xml 中检索 T1000 类型的元素和 File2.xml 中的 SomeValue 类型的元素。 谢谢。除了要匹配的正则表达式模式之外,您的回答不是 xml。我需要匹配的正则表达式模式是:&*T1& 或 &*T1000& 等。它以 &*T 开头,后跟任意整数,以 & 结尾。找到匹配项后,我需要提取到字符串 T1、T1000 等。在第二种情况下,我需要匹配 &*SomeValue&。正则表达式模式也可以与上述相同。然后我需要知道哪个 m.value 是 Type 1 (T1000),哪个是 Type 2 (SomeValue)。这是因为我的代码将从 File1.xml 中检索 T1000 类型的元素和 File2.xml 中的 SomeValue 类型的元素。 我不太明白,你能在你的帖子中添加输入和输出吗?我会做的 这是输入字符串:这是一些带有第一个标记 &*T1& 和第二个标记 &*T1001& 以及更多标记 &*SomeValue& 以及更多 &*A2ndValue& 的文本。我需要获取 &* (开始)和 & (结束)之间的值。然后我需要知道哪个值类似于 T1000(T 后跟一个整数)。对于这种情况,我将在 File1.xml 中检索元素 T1000 的值,否则我将从 File2.xml 中检索元素 SomeValue 的值。 我澄清了这个问题并添加了我的代码(在 pirs 的帮助下。我得到了我需要的匹配项。但是我如何区分这两种类型的令牌。【参考方案2】:

我明白你想做什么。下面的代码可以做所有事情:

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

namespace ConsoleApplication1

    class Program
    
        const string FILENAME = @"c:\temp\text.xml";
        static void Main(string[] args)
        
            string input = "This is some text with first token &*T1& and the second token &*T1001& and more tokens &*SomeValue& and still more &*A2ndValue&.";


            XDocument doc = XDocument.Load(FILENAME);

            string patternToken = "&[^&]+&";
            string patternTag = @"&\*(?'tag'[^&]+)&";

            MatchCollection  matches = Regex.Matches(input, patternToken);
            foreach(Match match in matches.Cast<Match>())
            
                string token = match.Value;
                string tag = Regex.Match(token, patternTag).Groups["tag"].Value;
                string tagValue = doc.Descendants(tag).Select(x => (string)x).FirstOrDefault();
                input = input.Replace(token, tagValue);
            

        
    

【讨论】:

正则表达式了解(代码片段)

简单了解一下正则表达式,用到了在查询即可。正则表达式(RegularExpression)是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为"元字符");描述了一种字符串匹配的模式(pattern),可以用来检查... 查看详情

如何使用 sed、awk 或 gawk 仅打印匹配的内容?

...替换等操作的示例和手册页。但就我而言,我有一个正则表达式,我想针对文本文件运行它以提取特定值。我不想做搜索和替换。这是从bash调用的。举个例子:正则表达式示例 查看详情

如何重复正则表达式匹配的文本?

】如何重复正则表达式匹配的文本?【英文标题】:Howtorepeattextmatchedbyaregex?【发布时间】:2011-08-0113:56:31【问题描述】:我正在尝试使用Eclipse搜索/替换将log4j添加到旧版软件中。这个想法是找到所有类声明并将它们替换为声明... 查看详情

批处理正则表达式怎样替换第二个指定字符

Findstr使用正则表达式搜索文件中的文本模式。语法 findstr[/b][/e][/l][/r][/s][/i][/x][/v][/n][/m][/o][/p][/offline][/g:File][/f:File][/c:String][/d:DirList][/a:ColorAttribute][Strings][[Drive:][Path]FileName[...]] 参数 /b 如果位于行的开头则匹配模... 查看详情

如何在 Eclipse 中使用正则表达式将大写字母替换为小写字母?

】如何在Eclipse中使用正则表达式将大写字母替换为小写字母?【英文标题】:HowtoreplaceuppercaseletterstolowercaselettersusingregexinEclipse?【发布时间】:2011-01-1603:40:25【问题描述】:我想检查我所有的源代码文件,并将每个出现的k_Xyyy... 查看详情

如何使用正则表达式 (glob) 搜索文件树

】如何使用正则表达式(glob)搜索文件树【英文标题】:Howtousearegularexpression(glob)tosearchafiletree【发布时间】:2010-10-0921:26:17【问题描述】:如何调整搜索树以处理有限的正则表达式?给定一个文件名,我需要找到与该文件名匹配... 查看详情

pycharm中使用正则表达式批量添加print括号

...号。 逐行添加括号未免效率过低,因此,可使用正则表达式的方法,提供解决方法。1、在pycharm编译器中,Ctrl+R调出替换功能框,勾选“Regex”,选择正则表达式替换方法 2、从上到下,第一个搜索框输入print(.*?);?$... 查看详情

linux中grep和find的区别

...统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是GlobalRegularExpressionPrint,表示全局正则表达式版本,它的使用权限是所有用户。而linux下的find功能:在目录结构中搜索文... 查看详情

如何使用匹配和正则表达式从该字符串中提取确切值?

】如何使用匹配和正则表达式从该字符串中提取确切值?【英文标题】:Howtoextractexactvaluefromthisstringwithmatchandregex?【发布时间】:2021-12-2519:04:27【问题描述】:嗨,我有这个字符串:varreferer="https://example.net:3000/page?room=room2"我只... 查看详情

如何使用正则表达式

正则表达式的两种应用场景:1)查找特定信息(搜索) 2)查找并编辑特定信息(替换)  将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如:序列‘\‘匹配"",而‘(‘则匹配"(" ... 查看详情

如何优雅地使用sublimetext

...换SublimeText支持PerlCompatibleRegularExpressions(PCRE)engine的正则表达式搜索,默认搜索为普通搜索,需要在搜索框左边点击对应按钮切换到正则表达式搜索,也可以使用快捷键进行切换。option+Cmd+r搜索的正则表达式和普通文本切换单文... 查看详情

正则表达式

在文件命令中经常会使用pattern正则表达式,它是可以描述一类字符串的模式(pattern),如果一个字符串可以用某个正则表达式来描述,就称这个字符和该正则表达式匹配。这和dos中用户可以使用通配符“*”代表任意字符类似。... 查看详情

如何从python中的正则表达式匹配中返回一个字符串? [复制]

】如何从python中的正则表达式匹配中返回一个字符串?[复制]【英文标题】:HowdoIreturnastringfromaregexmatchinpython?[duplicate]【发布时间】:2013-08-3120:49:21【问题描述】:我正在使用python脚本遍历文本文件中的行。我想在文本文档中搜... 查看详情

没有正则表达式的简单搜索和替换

】没有正则表达式的简单搜索和替换【英文标题】:Simplesearchandreplacewithoutregex【发布时间】:2011-12-1917:16:28【问题描述】:我有一个包含各种通配符的文件,我希望能够从(Bash)shell脚本中替换它。在其中一个变量包含正则表达式... 查看详情

如何修改一个正则表达式的匹配方式

search()参数为一个正则表达式,返回第一个与之匹配的子串的起始位置,如果找不到则返回-1。"JavaScript".search(/script/i);//=>4登录后复制如果search()的参数不是正则表达式,则首先会通过RegExp构造函数将它转化成正则表达... 查看详情

使用捕获搜索和替换正则表达式

】使用捕获搜索和替换正则表达式【英文标题】:Search-and-replaceregexwithcapture【发布时间】:2013-08-0823:11:11【问题描述】:我有一个长文本文件,我希望大部分内容保持不变,但某些短语需要翻译。这不完全是一个干净的搜索和... 查看详情

正则表达式实战(代码片段)

使用正则表达式正则表达式相关知识在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要,正则表达式就是用于描述这些规则的工具,换句话说正则表达式是一种工具,它定义了字符串的匹配模式... 查看详情

如何在 linux shell 脚本中使用正则表达式搜索文件 [关闭]

】如何在linuxshell脚本中使用正则表达式搜索文件[关闭]【英文标题】:Howsearchforfilesusingregexinlinuxshellscript[closed]【发布时间】:2011-08-1302:12:58【问题描述】:假设,我想在linux的所有子目录中,从shell脚本中搜索文件名中包含python... 查看详情