2

我有这种类型的文字:

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 之间出现的所有“位”。我如何用正则表达式做到这一点?

我发现问题Regex Match all characters between two strings,但那里的正则表达式匹配 string1 和 string2 之间的整个字符串,而我只想匹配该字符串的一部分。

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

先感谢您。

罗马

4

4 回答 4

0

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

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

您可以使用正则表达式:

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

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

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

于 2013-10-13T12:49:04.547 回答
0

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

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

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

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

于 2013-10-09T13:16:55.753 回答
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);
于 2013-10-09T13:25:32.853 回答