正则表达式 - 如何捕获出现在已知字符串中任何位置的任意字符串

本文关键字:字符串 任何 位置 任意 何捕获 正则表达式 | 更新日期: 2023-09-27 18:14:27

我需要帮助制作正则表达式。我有一个在编译时已知的字符串,我们称之为SpecificString。我还有另一个字符串,其值未知。例如,让我们将其称为ArbitraryString。输入字符串由一个SpecificString组成,该包含任何位置的ArbitraryString或与ArbitraryString相邻。我想要一个正则表达式模式,从输入字符串中捕获ArbitraryString供我以后使用。


例子:

  • 示例格式:输入字符串 =>捕获组的值
  • SpecificArbitraryStringString => ArbitraryString//里面
  • SpecHAHAHALOLificString => HAHAHALOL
  • SpecificStringYOLO => YOLO//相邻
  • SpecificStrisadng => sad
  • itsABea8tifulDaySpecificString => itsABea8tifulDay//也相邻
  • Show to be a heartbreakerpecificString => how to be a heartbreaker
  • SpecificSt this is the last example ring => this is the last example(在最后一个示例的输出中,由于某种原因 stackoverflow.com 省略了两端的空格,请忽略它并假设它们在那里(

我只能想出一个正则表达式,其长度与SpecificString长度线性增长,因此很难维护。有什么想法吗?

伪代码(不一定有效的 C#(:

static string GetArbitraryString(string input)
{
    const string specificString = "SpecificString";
    var regex = // regex pattern to find
    var match = regex.Match(input);
    string arbitraryString = match.CapturedGroups[0].Value;
    return arbitraryString;
}

仅接受正则表达式答案。

编辑:新问题:是否存在一个优雅的正则表达式解决方案?

正则表达式 - 如何捕获出现在已知字符串中任何位置的任意字符串

好吧,这是我在正则表达式答案方面得到的最好的答案,使用链式条件来确保您只获得所需的字符串(尽管在我看来它仍然非常不优雅(:

^(.*)?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)|(.*))?$

然后,您所要做的就是循环访问捕获组并选取不为空的捕获组。就这么简单。

而且,由于你使用的是 C#,因此甚至可以对所有捕获组使用具有相同名称的命名捕获组。无论哪一个被拾取,都将是命名捕获的值。

正则表达式101演示

我会使用字典

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