1

鉴于以下情况,我想知道是否可以使用我还不太熟悉的正则表达式编写更好的解决方案。我在我的基本 c# 字符串操作中看到了漏洞,尽管它有些工作。非常感谢您的想法和想法。

非常感谢,

克雷格

给定下面的字符串“story”,编写一个脚本来执行以下操作:

  1. 变量文本用 . 括起来{ }
  2. 如果变量文本为空白,请删除包含在 中的任何其他文本[ ]
  3. 要删除的文本可以用[ ].

格式:

    XYZ Company [- Phone: [({404}) ]{321-4321} [Ext: {6789}]]

例子:

  1. 填写了所有可变文本。

    XYZ Company - Phone: (404) 321-4321 Ext: 6789
    
  2. 未输入分机,删除“分机:”。

    XYZ Company - Phone: (404) 321-4321
    
  3. 没有分机也没有输入区号,去掉“分机:”和“( )”。

    XYZ Company - Phone: 321-4321
    
  4. 没有分机号,没有电话号码,也没有区号,删除“分机:”和“()”和“-电话:”。

    XYZ Company
    

这是我使用纯字符串操作的解决方案。

private string StoryManipulation(string theStory)
    {
        // Loop through story while there are still curly brackets
        while (theStory.IndexOf("{") > 0)
        {
            // Extract the first curly text area
            string lcCurlyText = StringUtils.ExtractString(theStory, "{", "}");                

            // Look for surrounding brackets and blank all text between
            if (String.IsNullOrWhiteSpace(lcCurlyText))
            {
                for (int lnCounter = theStory.IndexOf("{"); lnCounter >= 0; lnCounter--)
                {
                    if (theStory.Substring(lnCounter - 1, 1) == "[")
                    {
                        string lcSquareText = StringUtils.ExtractString(theStory.Substring(lnCounter - 1), "[", "]");
                        theStory = StringUtils.ReplaceString(theStory, ("[" + lcSquareText + "]"), "", false);
                        break;
                    }
                }
            }
            else
            {
                // Replace current curly brackets surrounding the text
                theStory = StringUtils.ReplaceString(theStory, ("{" + lcCurlyText + "}"), lcCurlyText, false);
            }
        }
        // Replace all brackets with blank (-1 all instances)
        theStory = StringUtils.ReplaceStringInstance(theStory, "[", "", -1, false);
        theStory = StringUtils.ReplaceStringInstance(theStory, "]", "", -1, false);
        return theStory.Trim();
    }
4

1 回答 1

2

处理嵌套结构通常超出了正则表达式的范围。但我认为有一个解决方案,如果你从内到外循环运行正则表达式替换。您将需要一个回调函数(a MatchEvaluator):

string ReplaceCallback(Match match)
{
    if(String.IsNullOrWhiteSpace(match.Groups[2])
        return "";
    else
        return match.Groups[1]+match.Groups[2]+match.Groups[3];
}

然后您可以创建评估器:

MatchEvaluator evaluator = new MatchEvaluator(ReplaceCallback);

然后你可以循环调用它,直到替换不再改变任何东西:

newString = Regex.Replace(
    oldString,
    @"
    \[    # a literal [
    (     # start a capturing group. this is what we access with "match.Groups[1]"
        [^{}[\]]
          # a negated character class, that matches anything except {, }, [ and ]
        * # arbitrarily many of those
    )     # end of the capturing group
    \{    # a literal {
    ([^{}[\]]*)
          # the same thing as before, we will access this with "match.Groups[2]"
    }     # a literal }
    ([^{}[\]]*)
          # "match.Groups[3]"
    ]     # a literal ]
    ",
    evaluator,
    RegexOptions.IgnorePatternWhitespace
);

这是正则表达式的无空格版本:

\[([^{}[\]]*)\{([^{}[\]]*)}([^{}[\]]*)]
于 2012-11-07T22:49:23.997 回答