C# c语言中带look-behind和ignore的正则表达式替换#

C# c语言中带look-behind和ignore的正则表达式替换#,c#,regex,C#,Regex,我需要删除文本中的所有“'s”,除了单词“let's” 例如:“jerry's let's cake's”>>“jerry let's cake” -这是可行的,但在大文本上需要很长时间 strText = Regex.Replace(strText, @"\b(?!let's)(?<=[a-z-]+)'s\b", ""); strext=Regex.Replace(strext,@“\b(?!让我们来)(?如果这是您真正需要的,那么它将是并执行以下操作: strText = strTe

我需要删除文本中的所有“'s”,除了单词“let's”

例如:“jerry's let's cake's”>>“jerry let's cake”

-这是可行的,但在大文本上需要很长时间

strText = Regex.Replace(strText, @"\b(?!let's)(?<=[a-z-]+)'s\b", "");
strext=Regex.Replace(strext,@“\b(?!让我们来)(?如果这是您真正需要的,那么它将是并执行以下操作:

strText = strText.Replace(" let's ", " let''s ")
                 .Replace("'s", "")
                 .Replace(" let'", " let's");
如果这是您真正需要的,那么它将是并执行以下操作:

strText = strText.Replace(" let's ", " let''s ")
                 .Replace("'s", "")
                 .Replace(" let'", " let's");

老实说,在这种情况下,最好还是走老套的路,沿着绳子走,在“让我们”这个词中跟踪你的位置,特别是处理这个问题

代码(未经测试,但希望您能理解):

StringBuilder=新建StringBuilder();
int-letsPos=-1;
for(int i=0;i
老实说,在这种情况下,最好还是走老式的方式,循序渐进,记住“让我们”这个词中你的位置,特别是处理这个问题

代码(未经测试,但希望您能理解):

StringBuilder=新建StringBuilder();
int-letsPos=-1;
for(int i=0;i
您错过的一个简单技巧是在负回溯中使用
\b

(?<!\blet)'s

(?您错过的一个简单技巧是在负回溯中使用
\b

(?<!\blet)'s

(?我也认为您可以编写自己的代码

private string myReplace(string text)
    {
        if (!text.Contains(' '))
        {
            return text.ToLower().Equals("let's") ? text : text.Replace("'s", string.Empty);
        }
        else
        {
            int index = text.IndexOf(' ');
            return myReplace(text.Substring(0, index)) + " " + myReplace(text.Substring(index + 1));
        }
    }

我还认为您可以编写自己的代码

private string myReplace(string text)
    {
        if (!text.Contains(' '))
        {
            return text.ToLower().Equals("let's") ? text : text.Replace("'s", string.Empty);
        }
        else
        {
            int index = text.IndexOf(' ');
            return myReplace(text.Substring(0, index)) + " " + myReplace(text.Substring(index + 1));
        }
    }

+1我同意Regex可能不是这里的最佳解决方案。但是,如果原始字符串包含“let'”或“plate's”,则此答案不完美,需要调整。更新,let之前的简单空格:)。是的,如果原始字符串包含无效单词let',则它将不起作用。我希望这是文本的边缘大小写。
呢让我们使用“@”
,或
(let's)
?A
\b
似乎是正确的。有很多边缘大小写必须包含无效的单词。如果这是很有可能的,这将不起作用,但我假设您具有高度有效的文本。+1我同意Regex可能不是这里的最佳解决方案。但是,如果原始字符串包含“let's”“或“血小板”此答案不完美,需要调整。更新,let之前的简单空格:)。是的,如果原始字符串包含无效的单词let,则它将不起作用。我希望这是文本的边缘大小写。关于
“let's let'@”
(let's)呢
?A
\b
似乎符合要求。有很多边缘大小写必须包含无效单词。如果很有可能,这将不起作用,但我假设您有高度有效的文本。\b(?@Vildan-它可能工作得更快,但请注意它将忽略
“Hello!”
,例如,因为它需要一个
\b
之前。如果我必须进行优化,我认为最快的应该是
's\b(?,这应该很快。\b(?@Vildan-它可能工作得更快,但请注意它会忽略
“Hello!”
,例如,因为它需要一个
\b
之前。如果我必须优化,我认为最快的应该是
的\b(?,应该是最快的。