正则表达式,用于查找包含在两个字符串中的字符串中的特定文本,但不包括整个字符串

时间:2013-10-09 13:04:47

标签: regex

我有这种类型的文字:

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 ++进行全局替换。我只需要正则表达式,代码将无法正常工作。

提前谢谢。

罗马

4 个答案:

答案 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。在记事本++上也尝试了它并且它正在工作。

演示网站中有详细说明,但如果您需要更多解释,请告诉我,我会详细说明!