吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 647|回复: 3
收起左侧

[已解决] 在使用正则表达式的疑惑

[复制链接]
wincao 发表于 2024-8-20 08:18
本帖最后由 wincao 于 2024-8-20 09:39 编辑

在Microsoft Visual Studio Community 2022 (64 位) - Current 版本 17.11.0环境下,输出结果是标点全部被替换了。哪里出问题了呢?

[Asm] 纯文本查看 复制代码
       private void test()
       {
           string text = "这是一个测试。这里有一些内容(包括括号内的内容,不要替换这些。)以及一些,逗号和、符号;需要被替换。";

           // 正则表达式解释:
           // [。,] 匹配中文句号或逗号
           // (?<!\(.*?[^()]) 负向后瞻,确保字符前面没有括号
           // (?![^()]*\)) 负向先行,确保字符后面没有闭合的括号
           string pattern = @"(?<!\(.*?[^()])[。,](?![^()]*\))";

           // 替换匹配的逗号和句号为空格
           string result = Regex.Replace(text, pattern, " ");

           Console.WriteLine(result);
           // 期望输出: "这是一个测试  这里有一些内容(包括括号内的内容,不要替换这些。)  以及一些 逗号和、符号;需要被替换 "
       }

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ygq170063 发表于 2024-8-20 08:44
private void test()
{
    string text = "这是一个测试。这里有一些内容(包括括号内的内容,不要替换这些。)以及一些,逗号和、符号;需要被替换。";

    // 使用正则表达式提取括号内的内容
    string patternBrackets = @"(.*?)";
    var matches = Regex.Matches(text, patternBrackets);
   
    // 替换括号内的内容为占位符
    int index = 0;
    foreach (Match match in matches)
    {
        text = text.Replace(match.Value, $"__PLACEHOLDER_{index++}__");
    }
   
    // 替换剩余内容中的标点符号
    string patternPunctuation = "[。,]";
    text = Regex.Replace(text, patternPunctuation, " ");
   
    // 还原括号内的内容
    index = 0;
    foreach (Match match in matches)
    {
        text = text.Replace($"__PLACEHOLDER_{index++}__", match.Value);
    }

    Console.WriteLine(text);
    // 输出: "这是一个测试  这里有一些内容(包括括号内的内容,不要替换这些。)  以及一些 逗号和、符号;需要被替换 "
}

免费评分

参与人数 1热心值 +1 收起 理由
wincao + 1 谢谢@Thanks!

查看全部评分

nzkboy 发表于 2024-8-20 09:13
Dropless 发表于 2024-8-20 09:34
一楼的思路是对的, 一般这种可以先把对象外的临时替换掉,之后再恢复.

不过从你的正则本身来看, 应该是混淆了全角与半角括号
[C#] 纯文本查看 复制代码
string pattern = @"(?<!\(.*?[^()])[。,](?![^()]*\))";


应当是
[C#] 纯文本查看 复制代码
string pattern = @"(?<!(.*?[^()])[。,](?![^()]*))";


不过这个正则本身还是有问题, 使用该正则的输出为:
    这是一个测试 这里有一些内容(包括括号内的内容,不要替换这些。)以及一些,逗号和、符号;需要被替换。

括号里的没有受影响了, 但是后面 "以及一些,逗号" 中的逗号没有被替换掉. 因为这个逗号前的文本也是符合  (.*?[^()]  这个模式的

改了一下, 测试文本额外添加了一对括号

[C#] 纯文本查看 复制代码
using System.Text.RegularExpressions;
string text = "这是一个测试。这里有一些内容(包括括号内的内容,不要替换这些。)以及(包括括号内的内容,不要替换这些。)一些,逗号和、符号;需要被替换。";

string pattern = @"(?<!([^()]*)[。,](?![^()]*))";

// 替换匹配的逗号和句号为空格
string result = Regex.Replace(text, pattern, " ");

Console.WriteLine(result);
// 期望输出: 这是一个测试 这里有一些内容(包括括号内的内容,不要替换这些。)以及(包括括号内的内容,不要替换这些。)一些 逗号和、符号;需要被替换


不过还是开头那句话, 这种一般按一楼的思路来要更好, 复杂的正则总会有各种 edge case 难以考虑到, 而且可读性差

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
wincao + 2 + 1 谢谢@Thanks!完美解决。

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-12 18:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表