C# 正则表达式-如何捕获出现在已知字符串中任意位置的任意字符串?
我需要帮助做一个正则表达式。我有一个在编译时已知的字符串,我们称它为C# 正则表达式-如何捕获出现在已知字符串中任意位置的任意字符串?,c#,regex,string,C#,Regex,String,我需要帮助做一个正则表达式。我有一个在编译时已知的字符串,我们称它为SpecificString。我还有另一个字符串,其值为未知。例如,我们将其称为ArbitraryString。输入字符串由一个SpecificString组成,该字符串在任何位置包含任意字符串,或与任意字符串相邻。我想要一个正则表达式模式,它从输入字符串中捕获任意字符串,供我以后使用 示例: 示例格式:输入字符串=>捕获的组值 SpecificArricryStringString=>ArricryString//内部 s
SpecificString
。我还有另一个字符串,其值为未知。例如,我们将其称为ArbitraryString
。输入字符串由一个SpecificString
组成,该字符串在任何位置包含任意字符串
,或与任意字符串
相邻。我想要一个正则表达式模式,它从输入字符串中捕获任意字符串
,供我以后使用
示例:
- 示例格式:输入字符串=>捕获的组值
=>SpecificArricryStringString
//内部ArricryString
=>spechahahahalificstring
hahahahall
=>SpecificStringYOLO
//相邻YOLO
=>specificstring
sad
=>itsABea8tifulDaySpecificString
//也相邻itsABea8tifulDay
=>显示心碎者特定字符串
如何成为心碎者
=>specific这是最后一个示例环
(在最后一个示例stackoverflow.com的输出中,出于某种原因省略了两端的空格,只需忽略它们并假设它们在那里)这是最后一个示例
SpecificString
的长度线性增长,这使得它很难维护。有什么想法吗
伪代码(不一定是有效的C#):
只接受正则表达式的答案
编辑:新问题:是否存在一个优雅的正则表达式解决方案?好吧,这是我在正则表达式方面得到的最好答案,使用chained确保你只得到你想要的字符串(尽管在我看来它仍然非常不优雅): 然后,您所要做的就是迭代捕获组并选择一个不是空的组。就这么简单 而且,由于您使用的是C#,因此您甚至可以对所有已命名的捕获组使用相同的名称。无论拾取哪一个,都将是命名捕获的值
我会用字典
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string[] inputs = {
"input string => captured group's value",
"SpecificArbitraryStringString => ArbitraryString // inside",
"SpecHAHAHALOLificString => HAHAHALOL",
"SpecificStringYOLO => YOLO // adjacent",
"SpecificStrisadng => sad",
"itsABea8tifulDaySpecificString => itsABea8tifulDay // also adjacent",
"Show to be a heartbreakerpecificString => how to be a heartbreaker",
"SpecificSt this is the last example ring => this is the last example"
};
Dictionary<string, string> dict = new Dictionary<string, string>();
string pattern = "^(?'name'[^=]+)=>(?'value'.*)";
foreach (string input in inputs)
{
Match match = Regex.Match(input, pattern);
dict.Add(match.Groups["name"].Value.Trim(), match.Groups["value"].Value.Trim());
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Text.RegularExpressions;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串[]输入={
“输入字符串=>捕获的组值”,
“SpecificArbiryStringString=>ArbiryString//inside”,
“spechahahahalificstring=>hahahahall”,
“SpecificStringYOLO=>YOLO//相邻”,
“specificstrisading=>sad”,
“itsABea8tifulDaySpecificString=>itsABea8tifulDay//也相邻”,
“显示心碎者SpecificString=>如何成为心碎者”,
“这是最后一个示例环=>这是最后一个示例”
};
Dictionary dict=新字典();
字符串模式=“^(?'name'[^=]+)=>(?'value'.*)”;
foreach(输入中的字符串输入)
{
Match=Regex.Match(输入,模式);
dict.Add(match.Groups[“name”].Value.Trim(),match.Groups[“Value”].Value.Trim());
}
}
}
}
您为什么只接受与正则表达式相关的答案?看来非正则表达式的解决方案会更简单。@Abion47我知道。但我真的很想知道是否存在一个优雅的正则表达式解决方案。我真的希望这条评论不会结束这个问题。如果你以编程方式生成长度随SpecificString
长度线性增长的正则表达式,它是否仍然难以维护?@SinaIravanian不,但答案肯定不会很好。在这种情况下,我只需要在没有regexp的情况下解决它。我越是觉得优雅的解决方案似乎越不可能存在,甚至闻起来都不像是可以与上下文无关语法完美匹配的东西。可能是CSG或无限制语法?不太完美,因为在第一个示例中,它捕获组“任意”,然后将第二个“字符串”实例作为单独的组捕获,而不是捕获整个内部“任意字符串”。@Abion47:Fixed。但现在情况更糟了:是的,我坚持认为,在这种情况下,非正则表达式解决方案将更容易、更优雅。从信息的角度来看,这很有趣,但我永远不想在实践中使用该代码。这里没有争论。您在发布之前没有阅读问题的详细信息,是吗?当我明确地告诉您这些值以前是未知的,必须使用正则表达式从输入字符串中提取时,您实际上是在使用我提供的捕获组值。不,我不是。只是测试数据来测试我的代码。难道你不想要经过测试的代码,而不是不起作用的代码吗?
^(.*)?S(?(1)|(.*))?p(?(2)|(.*))?e(?(3)|(.*))?c(?(4)|(.*))?i(?(5)|(.*))?f(?(6)|(.*))?i(?(7)|(.*))?(?(8)|(.*))?c(?(9)|(.*))?S(?(10)|(.*))?t(?(11)|(.*))?r(?(12)|(.*))?i(?(13)|(.*))?n(?(14)|(.*))?g(?(15)|(.*))?$
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string[] inputs = {
"input string => captured group's value",
"SpecificArbitraryStringString => ArbitraryString // inside",
"SpecHAHAHALOLificString => HAHAHALOL",
"SpecificStringYOLO => YOLO // adjacent",
"SpecificStrisadng => sad",
"itsABea8tifulDaySpecificString => itsABea8tifulDay // also adjacent",
"Show to be a heartbreakerpecificString => how to be a heartbreaker",
"SpecificSt this is the last example ring => this is the last example"
};
Dictionary<string, string> dict = new Dictionary<string, string>();
string pattern = "^(?'name'[^=]+)=>(?'value'.*)";
foreach (string input in inputs)
{
Match match = Regex.Match(input, pattern);
dict.Add(match.Groups["name"].Value.Trim(), match.Groups["value"].Value.Trim());
}
}
}
}