0

我正在创建一个正则表达式来查看所有文档顶部的版权信息是否格式正确。

版权很长,因此我的正则表达式也很长。

假设版权信息如下所示:

/*/////////////////////////////////////////////////////////////////////////

Copyright content which is a lot goes in here.

Programmer:  Tono Nam

/////////////////////////////////////////////////////////////////////////*/

然后我将使用正则表达式:

var pattern = 

@"/\*/////////////////////////////////////////////////////////////////////////

Copyright content which is a lot goes in here.

Programmer:  (?<ProgammerName>[\w '\.]+)

/////////////////////////////////////////////////////////////////////////\*/";

如果我将正则表达式应用于第一个文本,它会给我一个匹配,一切都很好。问题是当正则表达式不匹配时假设程序员/在顶部放置了一个额外的。我的正则表达式将不再匹配。这个例子很容易注意到,但真正的版权要长得多,知道错误在哪里会很好。或者有时会出现拼写错误。例如,您可能会遇到 Programer 而不是 Programmer。正因为如此,我将不得不查看整个版权并尝试发现错误。我认为应该有一种更简单的方法来做我需要的事情


编辑

如果主题恰好是:

/*//////////////////////////////////////// ///////////////////////

SOME_MISPELED_WORD 中有很多版权内容。

程序员:南远野

///////////////////////////////////////// /////////////////////*/

那么正则表达式将不匹配,因为SOME_MISPELED_WORD因此我想知道发生错误的索引,以便我可以查看:

/*//////////////////////////////////////// ///////////////////////

很多的版权内容都放在这里 <------------- 这里

而不是整个事情。


另一个例子是,如果版权信息是:

/*//////////////////////////////////////// ///////////////////////

这里有很多版权内容。

程序员:南远野

///////////////////////////////////////// //////////////////////*/

我想在最后一行得到一个错误,因为有一个额外的/.

4

3 回答 3

0

最后我有解决方案:

基本上我们想知道正则表达式在哪里失败。如果我们必须在哪里获得不变的字符串,我们将能够比较它们并查看不同的字符。换句话说,如果我在哪里拥有:

var a = "12345";
var b = "1234A";

然后我们可以a[0]b[0]then a[1]with进行比较,b[1]直到我们有差异。

所以让我们这样做吧!

假设我们的版权必须如下所示:

/*/////

Copyright content which is a lot goes in here.

Programmer:Tono Nam

Description:This is the description of the file....

/////*/

让我们删除所有可能变化的东西,以便我们可以应用我们的第一个示例:

/*/////

Copyright content which is a lot goes in here.

Programmer:

Description:

/////*/

然后唯一复杂的事情是创建一个正则表达式,它将删除所有可能变化的东西,以便最终得到该字符串。所以该模式将是:

 var regexPattern = @"(?s)(/\*/*.+Programmer:)(?<name>[^\r\n]*?)(\r.*Description:)(?<desc>[^\r\n]*)(\r.*?/*\*/)";

使用这种模式,我们将能够转向:

/*/////

Copyright content which is a lot goes in here.

Programmer:Tono Nam bla bla bla

Description:THIS IS A DIFFERENT DESCRIPTION

/////*/

进入

/*/////

Copyright content which is a lot goes in here.

Programmer:

Description:

/////*/

现在我们有两个字符串要比较!




这是我刚刚解释的代码

// the subject we want to test
            var subject =
@"/*/////

Copyright content which is a lot goes in here.

Programmer:Tono Nam

Description:This is the description of the file....

/////*/";

            // the actual pattern this should be a readonly constant type on a real program cause it never should change
            var pattern =
@"/*/////

Copyright content which is a lot goes in here.

Programmer:

Description:

/////*/";

            // we use this pattern to turn the first subject into the second if we can
            var regexPattern = @"(?s)(/\*/*.+Programmer:)(?<name>[^\r\n]*?)(\r.*Description:)(?<desc>[^\r\n]*)(\r.*?/*\*/)";

            // note $1 means group 1 so here we are basically removing the groups name and desc
            var newSubject = Regex.Replace(subject, regexPattern, "$1$2$3");

            // at this point if newSubject = pattern we know that the header is formatted correctly!

            // Let's see where they are different!
            for (int i = 0; i < pattern.Length; i++)
            {
                if (pattern[i] != newSubject[i])
                {
                    throw new Exception("There is a problem at index " + i);
                }
            }

在这个例子中它应该可以工作,因为我的主题格式正确。但是如果我在乞求处放置一个额外的 / 然后看看会发生什么:(我突出显示了 6 个/字符应该有 5 个

在此处输入图像描述

于 2012-07-30T21:39:07.787 回答
0

试试这个Regex

/\*/{2,}(?:\n|.)*(?:Programm?er\s*:\s*(?<programmer>.+))[\n\r\s]*(?:Description\s*:\s*(?<description>.+))?

并获取名为programmerand的组description。这适用于上述所有条件。

于 2012-07-31T06:19:57.357 回答
0

我认为拥有上面的正则表达式太严格了。尝试更多类似以下的方法:

@"^/\*(/*)(.*)(Programmer:|Programer:){1}(\d*)(<ProgrammerName>){1}(/*)\*/$"

这将确保您在注释块中,它可以在开始和结束处有任意数量的正斜杠,并且不会限制输入版权声明的能力,同时仍然确保程序员已经正确签署了他的名字。虽然老实说,我认为尝试在正则表达式中强制执行程序员名称会给您带来更多麻烦,而不是从长远来看值得。我建议将其拉出并检查是否存在程序员“部分”。

于 2012-07-30T20:48:29.073 回答