我有这种类型的文字:
string1_dog_bit_johny_bit_string2
string1_cat_bit_johny_bit_string2
string1_crocodile_bit_johny_bit_string2
string3_crocodile_bit_johny_bit_string4
string4_crocodile_bit_johny_bit_string5
我想找到仅在string1和string2之间出现的所有“bit”。如何使用正则表达式执行此操作?
我发现了问题Regex Match all characters between two strings,但正则表达式匹配string1和string2之间的整个字符串,而我想只匹配该字符串的一部分。
我正在使用Notepad ++进行全局替换。我只需要正则表达式,代码将无法正常工作。
提前谢谢。
罗马
答案 0 :(得分:0)
这个正则表达式将完成这项工作:
^string1_(?:.*(bit))+.*_string2$
^
表示文字的开头(如果您使用m
选项,则表示行:/<regex>/m
)$
表示文字的结尾.
表示任何字符*
表示前一个字符/表达式重复0次或更多次(?:<stuff>)
表示非捕获组(<stuff>
因匹配而未被捕获)答案 1 :(得分:0)
如果您不关心性能或没有要检查的大/多字符串,则可以使用^string1_(.*(bit).*)*_string2$
。外括号允许多次出现“位”。
如果您向我们提供您想要使用的语言,我们可以提供更具体的解决方案。
编辑:当您添加了在Notepad ++中尝试替换时,我提出以下建议:
使用(?<=string1_)(.*)bit(.*)(?=_string2)
作为正则表达式,使用$1xyz$2
作为替换模式(将xyz替换为您的字符串)。然后执行“全部替换”操作,直到N ++找不到更多匹配项。这里的问题是这个正则表达式每次迭代每行只匹配1 bit
- 因此需要重复应用。
顺便说一下。即使正则表达式与整行相匹配,您仍然只能使用捕获组替换它的一部分。
答案 2 :(得分:0)
如果我在这里正确理解了你想要的代码
var intput = new List<string>
{
"string1_dog_bit_johny_bit_string2",
"string1_cat_bit_johny_bit_string2",
"string1_crocodile_bit_johny_bit_string2",
"string3_crocodile_bit_johny_bit_string4",
"string4_crocodile_bit_johny_bit_string5"
};
Regex regex = new Regex(@"(?<bitGroup>bit)");
var allMatches = new List<string>();
foreach (var str in intput)
{
if (str.StartsWith("string1") && str.EndsWith("string2"))
{
var matchCollection = regex.Matches(str);
allMatches.AddRange(matchCollection.Cast<Match>().Select(match => match.Groups["bitGroup"].Value));
}
}
Console.WriteLine("All matches {0}", allMatches.Count);
答案 3 :(得分:0)
您可以使用正则表达式:
(?:string1|\G)(?:(?!string2).)*?\Kbit
regex101 demo。在记事本++上也尝试了它并且它正在工作。
演示网站中有详细说明,但如果您需要更多解释,请告诉我,我会详细说明!