用于在两个字符串之间查找匹配(复数)的正则表达式

时间:2015-02-20 16:32:27

标签: c# regex

我基本上希望将搜索限制为字符串的特定部分。我不知道这是否可以用正则表达式,但我还没有找到任何说它不可能!我发现的帖子是我发现很难推断我使用的情况,或者他们依靠非正则表达式函数来完成这项工作。

我的意思的一般例子是:

鉴于书籍的全文,请在第1章第2章之间返回 的所有实例

以上示例不是我的预期用法,但我想以一般方式提出要求,以便后代可以轻松地将任何答案应用于自己的目标。

我的目标是使用C#Regex.Replace函数。我想为它提供整个字符串,并让它只替换字符串的特定部分的匹配。

我当然可以通过拆分字符串,仅将相关部分提供给Regex.Replace,然后使用StringBuilder重新组装它来完成此操作。但如果有可能用纯粹的正则表达式实现这一点,我不想这样做。

以下是此情况的一些示例输入,其中所需的匹配项为粗体:

序言下面的故事是为了你阅读第1章 快速棕色狐狸跳过 懒狗第2章狗死了第11章唐'请问第21章末尾的遗失章节

1 个答案:

答案 0 :(得分:2)

是的,.NET正则表达式引擎允许lookaround assertions无限期重复,使这成为可能:

resultString = Regex.Replace(subjectString, @"(?<=\bChapter 1\b.*)\bthe\b(?=.*\bChapter 2\b)", "ye", RegexOptions.Singleline);

<强>解释

(?<=           # Assert that it's possible to match this before the current position:
 \bChapter 1\b # the text "Chapter 1" (but not "Chapter 11")
 .*            # followed by any number of characters.
)              # End of lookbehind assertion.
\bthe\b        # Match "the" (but not "there" or "lathe").
(?=            # Assert that it's possible to match this after the current position:
 .*            # any number of characters, followed by
 \bChapter 2\b # the text "Chapter 2"
)              # End of lookahead assertion.