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



我有这种类型的文本:

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

我想找到仅在字符串 1 和字符串 2 之间出现的所有"位"。如何使用正则表达式执行此操作?

我发现了问题 Regex 匹配两个字符串之间的所有字符,但那里的正则表达式匹配 string1 和 string2 之间的整个字符串,而我只想匹配该字符串的一部分。

我正在记事本++中进行全局替换。我只需要正则表达式,代码不起作用。

提前谢谢你。

罗马

如果我在这里正确理解了一段代码来做你想做的事情

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

这个正则表达式将完成这项工作:

^string1_(?:.*(bit))+.*_string2$
  • ^表示文本的开头(如果您使用m选项,则表示行,如下所示:/<regex>/m (
  • $表示文本的结尾
  • .表示任何字符
  • *表示前一个字符/表达式重复 0 次或更多次
  • (?:<stuff>)表示非捕获组(<stuff>不会因匹配而被捕获(

如果您不关心性能或没有要检查的大/多字符串,则可以使用 ^string1_(.*(bit).*)*_string2$。外括号允许多次出现"位"。

如果您向我们提供您要使用的语言,我们可以提供更具体的解决方案。

编辑:正如您添加的那样,您正在尝试在记事本++中替换,我提出以下建议:使用 (?<=string1_)(.*)bit(.*)(?=_string2) 作为正则表达式,$1xyz$2 作为替换模式(将 xyz 替换为字符串(。然后执行"全部替换"操作,直到 N++ 找不到更多匹配项。这里的问题是,这个正则表达式每次迭代每行只能匹配 1 个bit - 因此需要重复应用。

顺便说一句,即使正则表达式与整行匹配,您仍然只能使用捕获组替换它的一部分。

您可以使用正则表达式:

(?:string1|G)(?:(?!string2).)*?Kbit

正则表达式101演示。在记事本++上也尝试过,它正在工作。

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

最新更新