使用正则表达式,如何用分组和其他模式条件替换同一单词的多次出现

Using RegEx, How to replace multiple occurrences of the same word with grouping and other pattern criteria

提问人:Aracknid416 提问时间:2/28/2023 最后编辑:Aracknid416 更新时间:2/28/2023 访问量:68

问:

我正在尝试使用查找/替换 GREP 工具替换某些 VB.NET 代码中注释中的某些特定单词,该工具本身正在使用 VB.NET 正则表达式匹配规则。

为了这个例子,假设我有这个(请注意,我不想改变代码本身):

'*** This day is the day of all days
     '*** This day is the day of all days (there are 4 spaces at the start)
    Dim day as integer
    day=day+1

我想要这个:

'*** This night is the night of all nights
     '*** This night is the night of all nights (there are 4 spaces at the start)
    Dim day as integer
    day=day+1

我的正则表达式如下:

(^\s*'。)天(.)

我用它代替它:

$1晚$2

这只找到白天的最后一次出现,并用夜晚代替它,所以我看到这个:

'*** this day is the day of all nights
​    '*** this day is the day of all nights
​    Dim day as integer
​    day=day+1

如何更换它,使其看起来像这样:

'*** this night is the night of all nights
​    '*** this night is the night of all nights
​    Dim day as integer
​    day=day+1
正则表达式 vb.net

评论

0赞 Lou 2/28/2023
我不确定如何解决您的问题,但我建议两件事:一是测试正则表达式的 www.regex101.com,另一件事是关于如何使用正则表达式排除某些模式的资源: rexegg.com/regex-best-trick.html
0赞 David 2/28/2023
^\s*'\*{3}.*(?'match'day).*创建一个名为“Match”的命名捕获组,但仅匹配注释中的结果。

答:

1赞 The fourth bird 2/28/2023 #1

使用 .NET,您可以使用例如:

(?<!\S)(?<!\bDim\s+)day(s)?(?!\S)

解释

  • (?<!\S)负 lookabehind,断言左侧的空白边界
  • (?<!\bDim\s+)否定后视,断言后跟左侧的空格字符Dim
  • day(s)?匹配并捕获可选字符days
  • (?!\S)断言右侧的空白边界

请参阅 .NET 正则表达式演示

在更换使用中:

night$1

输出将是:

'*** This night is the night of all nights
     '*** This night is the night of all nights (there are 4 spaces at the start)
    Dim day as integer
    day=day+1

评论

1赞 Aracknid416 2/28/2023
谢谢你的回答。我提供了一个简单的例子,你的解决方案虽然不完全是我想要的,但帮助我弄清楚了我需要做什么。 具体来说,我不想在正则表达式中包含任何特定代码(在您提供的解决方案中,它已将“暗淡”硬编码到正则表达式中)。使用您的示例和下面 Cary 的示例,我能够得出一个足够好的解决方案。
1赞 Cary Swoveland 2/28/2023 #2

我们可以利用 VB .NET 支持可变长度后视的事实,这允许我们将以下正则表达式的匹配项替换为匹配项。"day""night"

(?<='.*)\bday(?=s\b|\b)

演示

正则表达式可以分解如下。

(?<=   begin a positive lookbehind
  '    match a single quote
  .*   match zero or more characters other than line terminators
)      end the positive lookbehind
(?=    begin a positive lookahead
  s\b  match 's' followed by a word boundary
  |    or
  \b   match a word boundary
)      end the positive lookahead

如链接所示,这匹配如下。"day"

'*** This day is the day of all days
          ^^^        ^^^        ^^^
'    *** This day is the day of all days
              ^^^        ^^^        ^^^
Dim day as integer 'so far so good today but maybe not another day
                                                               ^^^
day=day+1   'a daystar is a planet visible in the east before sunrise

然而,一切都不是葡萄酒和玫瑰。

text1.Text = "'day"   'No, no, not there!
               ^^^

评论

1赞 Aracknid416 2/28/2023
谢谢你的回答。我提供了一个简单的例子,并使用了“天”这个词,它“只是一个词”,但你太聪明了,发现了其他可能导致问题的“天”的例子。我将要寻找的实际单词更长且非常独特,因此我认为我不会遇到其他使用它的情况。但它帮助我弄清楚我需要做什么。使用您的示例和上面《第四只鸟》中的例子,我能够得出一个对我来说足够好的解决方案。
0赞 Cary Swoveland 2/28/2023
我很想回应你的最后一句话,说“这才是最重要的”,但当然不是。每当你学到一些东西时,它都会帮助你在未来解决问题或学习其他东西(假设你不会很快被公共汽车碾过)。