提问人:Aracknid416 提问时间:2/28/2023 最后编辑:Aracknid416 更新时间:2/28/2023 访问量:68
使用正则表达式,如何用分组和其他模式条件替换同一单词的多次出现
Using RegEx, How to replace multiple occurrences of the same word with grouping and other pattern criteria
问:
我正在尝试使用查找/替换 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
答:
1赞
The fourth bird
2/28/2023
#1
使用 .NET,您可以使用例如:
(?<!\S)(?<!\bDim\s+)day(s)?(?!\S)
解释
(?<!\S)
负 lookabehind,断言左侧的空白边界(?<!\bDim\s+)
否定后视,断言后跟左侧的空格字符Dim
day(s)?
匹配并捕获可选字符day
s
(?!\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
我很想回应你的最后一句话,说“这才是最重要的”,但当然不是。每当你学到一些东西时,它都会帮助你在未来解决问题或学习其他东西(假设你不会很快被公共汽车碾过)。
评论
^\s*'\*{3}.*(?'match'day).*
创建一个名为“Match”的命名捕获组,但仅匹配注释中的结果。