1

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

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

strText = Regex.Replace(strText, @"\b(?!let's)([a-z-]+)'s\b", @"$1");

- 这行得通,但在大文本上需要很长时间。

strText = Regex.Replace(strText, @"\b(?!let's)(?<=[a-z-]+)'s\b", "");
  • 这个并没有忽略“让我们”

我在第二个陈述中做错了什么?

4

4 回答 4

3

如果这确实是您所需要的,那么明智的做法是不要使用 Regex并执行以下操作:

strText = strText.Replace(" let's ", " let''s ")
                 .Replace("'s", "")
                 .Replace(" let'", " let's");
于 2012-07-10T16:37:14.563 回答
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));
        }
    }
于 2012-07-10T17:18:07.513 回答
1

您错过的简单技巧是\b在消极的lookbehind 中使用:

(?<!\blet)'s

工作示例:http ://regexr.com?31g9c

于 2012-07-10T17:02:21.820 回答
0

老实说,在这种情况下,最好采用老式的方式走线,跟踪你在“让我们”这个词中的位置并特别处理它。

代码(未经测试,但希望你明白):

StringBuilder stripped = new StringBuilder();
int letsPos = -1;

for(int i = 0; i < strText.Length; i++)
{
     char thisChar = strText[i];

     switch(letsPos)
     {    
         case -1:
             if(i == 0 || thisChar == ' ')
                 letsPos = 0;
             break;
         case 0:
             letsPos = (thisChar == 'l') ? 1 : -1;
             break;
         case 1:
             letsPos = (thisChar == 'e') ? 2 : -1;
             break;
         case 2:
             letsPos = (thisChar == 't') ? 3 : -1;
             break;
         case 3:
             letsPos = (thisChar == '\'') ? 4 : -1;
             break;
         case 4:
             letsPos = (thisChar == 's') ? 5 : -1;
             break;
         case 5:
             letsPos = (thisChar == ' ') ? 0 : -1;
             break;
     }

     if(thisChar == '\'' && 
         i+1 < strText.Length && 
         strText[i+1] == 's' && 
         (letsPos < 4 || (i+2 < strText.Length && strText[i+2] != ' '))
     {
         //skip the "'s"
         i += 2;
         letsPos = -1;
     }
     else
     {
         //not "'s" or we have a whole-word "let's"
         stripped.Append(thisChar);
     }
}

return stripped.ToString();
于 2012-07-10T16:56:47.797 回答