正则表达式 - 如何捕获出现在已知字符串中任何位置的任意字符串
本文关键字:字符串 任何 位置 任意 何捕获 正则表达式 | 更新日期: 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());
}
}
}
}