C# 自定义标记中的正则表达式替换
我有一个字符串,其中可能包含以下一个或多个标记:C# 自定义标记中的正则表达式替换,c#,regex,replace,C#,Regex,Replace,我有一个字符串,其中可能包含以下一个或多个标记: <CHOICE [some words] [other words]> 我需要按如下方式替换所有出现的此标记: Example: I like <CHOICE [cars and bikes] [apple and oranges]> Result: I like cars and bikes 基本上,用第一组括号中出现的字符串替换整个标记 看起来抓捕小组是一条路要走,但我无法理解如何让他们工作 感谢您的帮助 编辑:R
<CHOICE [some words] [other words]>
我需要按如下方式替换所有出现的此标记:
Example: I like <CHOICE [cars and bikes] [apple and oranges]>
Result: I like cars and bikes
基本上,用第一组括号中出现的字符串替换整个标记
看起来抓捕小组是一条路要走,但我无法理解如何让他们工作
感谢您的帮助
编辑:Regex不是一个要求,我认为它是最好的方法,但我看到一些评论告诉我,它不需要,所以任何其他建议都一样好。谢谢 只是为了好玩。这是每个状态机的一个校园,具有线性的时间复杂度
只是为了好玩。这是每个状态机的一个校园,具有线性的时间复杂度
首先获取匹配组,然后为每个匹配组替换[和]中的第一个字符串
首先查找获取匹配组,然后为每个匹配组替换[和]中的第一个字符串 找到 输出为: 汽车和自行车 苹果和桔子 我喜欢汽车和自行车 \<*选择* 火柴 输出为: 汽车和自行车 苹果和桔子 我喜欢汽车和自行车 \<*选择*
匹配我想这是最好的方法
string text = "This is some dummy text with the choice < CHOICE [ white black green cyan ] [yellow green]>." +
" The second choice <CHOICE [pink brown red] [blue cyan]>.";
string pattern = @"<\s*?CHOICE\s*\[\s*?(.+?)\s*?\].*?>";
var result = Regex.Replace(text, pattern, r => String.Join(" and ", r.Groups[1].Value.Split(' ', StringSplitOptions.RemoveEmptyEntries)));
Console.WriteLine(result);
输出
这是一些选择白色、黑色、绿色和青色的虚拟文本。第二种选择是粉红色、棕色和红色。我想这是最好的方法
string text = "This is some dummy text with the choice < CHOICE [ white black green cyan ] [yellow green]>." +
" The second choice <CHOICE [pink brown red] [blue cyan]>.";
string pattern = @"<\s*?CHOICE\s*\[\s*?(.+?)\s*?\].*?>";
var result = Regex.Replace(text, pattern, r => String.Join(" and ", r.Groups[1].Value.Split(' ', StringSplitOptions.RemoveEmptyEntries)));
Console.WriteLine(result);
输出
这是一些选择白色、黑色、绿色和青色的虚拟文本。第二种选择是粉色、棕色和红色。这里有正则表达式的替代方法-只需使用第一个开括号和闭括号的索引即可获取文本此正则表达式的步骤不止一步,而且告诉你事实上,你可能可以更快地完成此操作,也可能使用循环更少的代码。你尝试过什么,“什么是不起作用的?”将军,我正在想办法解决这个问题。首先,我需要识别将作为一个整体被替换的标记,然后用第一个括号中的内容替换它。然后,如果同一字符串中有多个标记,则重复标记的任何距离。到目前为止,我只处理过正则表达式替换,比如text=regex.Replacetext、pattern、fixedvalue;所以我有点迷糊了…你是在HTML还是XML上使用这个?这里有regex的替代方法-简单地使用第一个开括号和闭括号的索引来获取文本这个regex有不止一个步骤或者其他,告诉你事实上,你可以更快地完成,也许更少的代码使用一个循环,你尝试过什么,“什么是不起作用的?”将军,我正在想办法解决这个问题。首先,我需要识别将作为一个整体被替换的标记,然后用第一个括号中的内容替换它。然后,如果同一字符串中有多个标记,则重复标记的任何距离。到目前为止,我只处理过正则表达式替换,比如text=regex.Replacetext、pattern、fixedvalue;所以我有点迷路了…你是在HTML还是XML上使用这个?非常感谢!这对于标记的第一次出现非常有效。对于多个标签,如果之前有不相关的标签,或者多个选择标签,这会有一些问题,但我认为这是一个很好的起点,了解如何使其充分发挥作用。我一点也没想到这种方法。@Sting1是的,这只是为了好玩,因为我在等电梯。正则表达式可能也是一个不错的选择,我用StateMachineThaks更新了很多!这对于标记的第一次出现非常有效。对于多个标签,如果之前有不相关的标签,或者多个选择标签,这会有一些问题,但我认为这是一个很好的起点,了解如何使其充分发挥作用。我一点也没想到这种方法。@Sting1是的,这只是为了好玩,因为我在等电梯。regex可能也是一个不错的选择,我用StateMachine更新了它。我认为这很好用!我相信只有最后一个子字符串需要调整如下:Substring1,matches1[0]。ToString.Length-2对不起,我做了进一步的编辑,因为我的原始更正包含错误。看起来它的长度是-2.5米,是汽车和自行车@ArthurGrigoryan编辑的答案。请检查它。@Sting1已删除。子字符串。检查最新的答案。我认为这非常有效!我相信只有最后一个子字符串需要调整如下:Substring1,matches1[0]。ToString.Length-2对不起,我做了进一步的编辑,因为我的原始更正包含错误。看起来它的长度是-2.5米,是汽车和自行车@ArthurGrigoryan编辑的答案。请检查它。@Sting1已删除。子字符串。检查最新答案。现在尝试并测试它。准备好制作了:你怎么知道要删除的空格?@Sushant Yelpale没有理解你的意思,但是正则表达式处理所有空格,除了通过拆分和删除空条目处理的选择字之间的空格。如果有超过
1输入字符串中的连续空格,在不知道其含义的情况下不应删除。就像您在中从
I like cars and bikes
MatchCollection matches = Regex.Matches(InputStr, @"<CHOICE(.*?)>");
foreach(Match Item in matches)
{
MatchCollection matches1 = Regex.Matches(Item.ToString(), @"\[(.+?)]");
string FirstOccurence = matches1[0].Groups[1].ToString();
InputStr = InputStr.Replace(Item.ToString(), FirstOccurence);
}
string pattern = @"\< *CHOICE *((\[(?<choice>[a-zA-Z0-9 ]+)\]) *)+ *>";
Regex regex = new Regex(pattern);
string source = "I like <CHOICE [cars and bikes] [apple and oranges]>";
var match = regex.Match(source);
if (match.Success)
{
for (int i = 0; i < match.Groups["choice"].Captures.Count; i++)
{
Debug.WriteLine(match.Groups["choice"].Captures[i]);
}
string replaced = regex.Replace(source, match.Groups["choice"].Captures[0].Value);
Debug.WriteLine(replaced);
}
string text = "This is some dummy text with the choice < CHOICE [ white black green cyan ] [yellow green]>." +
" The second choice <CHOICE [pink brown red] [blue cyan]>.";
string pattern = @"<\s*?CHOICE\s*\[\s*?(.+?)\s*?\].*?>";
var result = Regex.Replace(text, pattern, r => String.Join(" and ", r.Groups[1].Value.Split(' ', StringSplitOptions.RemoveEmptyEntries)));
Console.WriteLine(result);