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());
            }
        }
    }
}