我正在阅读 Martin Fowler 撰写的一篇关于Composed Regular Expressions的文章。这是您可以使用如下代码的地方:
const string pattern = @"^score\s+(\d+)\s+for\s+(\d+)\s+nights?\s+at\s+(.*)";
并把它分解成更像这样的东西:
protected override string GetPattern() {
const string pattern =
@"^score
\s+
(\d+) # points
\s+
for
\s+
(\d+) # number of nights
\s+
night
s? #optional plural
\s+
at
\s+
(.*) # hotel name
";
return pattern;
}
}
或这个:
const string scoreKeyword = @"^score\s+";
const string numberOfPoints = @"(\d+)";
const string forKeyword = @"\s+for\s+";
const string numberOfNights = @"(\d+)";
const string nightsAtKeyword = @"\s+nights?\s+at\s+";
const string hotelName = @"(.*)";
const string pattern = scoreKeyword + numberOfPoints +
forKeyword + numberOfNights + nightsAtKeyword + hotelName;
甚至这样:
const string space = @"\s+";
const string start = "^";
const string numberOfPoints = @"(\d+)";
const string numberOfNights = @"(\d+)";
const string nightsAtKeyword = @"nights?\s+at";
const string hotelName = @"(.*)";
const string pattern = start + "score" + space + numberOfPoints + space +
"for" + space + numberOfNights + space + nightsAtKeyword +
space + hotelName;
这听起来很容易做到,并且可能有一些好处。我绝不是一个“正则表达式的人”,并且经常发现自己在网上搜索以找到我需要的正则表达式,而不是花时间为自己编写它。找到适合给定问题的正则表达式后,我将其复制并粘贴并对其进行测试以确保它与宣传的一样。然后我可能会发表评论来描述它的作用。但后来我开始了生活中更大更好的事情。
我想知道以 Martin Fowlers 讨论中描述的方式打破正则表达式模式是否真的会让事情比评论更容易理解?归根结底,您的代码中仍然有一个丑陋的正则表达式,只是现在它有很多部分。如果您需要扩展该表达式……这如何帮助您真正理解正则表达式的作用?
我知道所有顽固的 perl 人都喜欢他们的正则表达式模式。但是对于那些在每个其他项目(问题)中不多次处理正则表达式的人来说,您是否发现将正则表达式模式分解成更小的位或多或少的可读性?有没有人在项目中使用过这个概念并发现它很有用?...没用处?