繁体   English   中英

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

[英]Regex - How to capture an arbitrary string appearing anywhere in a known string?

我需要帮助做一个正则表达式。 我有一个在编译时就知道的字符串,我们称它为SpecificString 我也有另一个字符串,其值是知道。 出于示例目的,我们将其称为ArbitraryString 输入字符串由一个在任何位置包含ArbitraryString或与ArbitraryString相邻的SpecificString 我想要一个可从输入字符串中捕获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 (在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#,因此您甚至可以对所有这些命名捕获组使用相同的名称。 取而代之的是命名捕获的值。

Regex101上的演示

我会用字典

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM