是否有用于注释正则表达式的通用方法:内联注释引用RegEx的不同部分或针对所有表达式的常规注释?
是否有用于注释正则表达式的通用方法:内联注释引用RegEx的不同部分或针对所有表达式的常规注释?
Answers:
我认为,一种好的做法是在注释中简明地说明正则表达式的一般概念。这样可以节省其他开发人员(有时是自己)的复制粘贴正则表达式像一个解析器的麻烦RegExr,不仅要了解它做什么。
这在某种程度上是特定于语言的答案,但是问题中没有陈述任何语言。
“深入Python”一书建议使用Verbose正则表达式实现注释:
Python允许您使用称为详细正则表达式的方法来执行此操作。详细的正则表达式与紧凑的正则表达式在两个方面不同:
- 空格被忽略。空格,制表符和回车符不匹配,因为空格,制表符和回车符。它们根本不匹配。(如果要在冗长的正则表达式中匹配空格,则需要在其前面加上反斜杠来对其进行转义。)
- 评论将被忽略。冗长的正则表达式中的注释就像Python代码中的注释:它以
#
字符开头,一直到行尾。在这种情况下,它是多行字符串中的注释,而不是源代码中的注释,但是工作方式相同。
例:
>>> pattern = """
^ # beginning of string
M{0,4} # thousands - 0 to 4 M's
(CM|CD|D?C{0,3}) # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
# or 500-800 (D, followed by 0 to 3 C's)
(XC|XL|L?X{0,3}) # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
# or 50-80 (L, followed by 0 to 3 X's)
(IX|IV|V?I{0,3}) # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
# or 5-8 (V, followed by 0 to 3 I's)
$ # end of string
"""
>>> re.search(pattern, 'M', re.VERBOSE) 1
来源和进一步的细节在这里
此方法有一个轻微的缺点,即调用方必须知道该模式是以详细格式编写的,并相应地对其进行调用。
re.compile
在定义模式时使用它,并且仅存储结果对象。这样,re.VERBOSE
不需要将模式编译标志(包括)与模式本身分开。
#
如果我使用的是冗长标志,该如何匹配?顺便说一句:源链接似乎已关闭。
通常,我将编写一个正则表达式,而不是解释正则表达式的各个部分,而是解释其目的。那是什么,为什么。这有点像问“我的评论应该是什么样?” 有人会说“ 不要写代码在做什么,写代码为什么要做它所做的事情 ”
// Strip the leading "?" and remove the query parameters "offset=<integer>" & "count=<integer> so we have a pattern of the request"
var search = location.search.substring(1).replace(/offset=[0-9]+?&/g, "").replace(/count=[0-9]+?&/g, "");
除非您试图通过代码中的注释来教给别人有关正则表达式的知识,否则我不认为要解释每个部分的作用。与其他程序员一起工作时,您可以放心地假设一个人会知道一些全局正则表达式。
我想这真的取决于您如何将正则表达式放在一起。一般来说,我认为将注释放在实际的正则表达式字符串本身中是个坏主意(据我所知,在大多数情况下是不可能的)。如果确实需要注释正则表达式的特定部分(是否要教某人?),则将每个块分成单独的字符串,放在各自的行中,并使用编程语言的常规注释过程对每一行进行注释。否则,pleinolijf的答案就很好。
例:
string myregex = "\s" // Match any whitespace once
+ "\n" // Match one newline character
+ "[a-zA-Z]"; // Match any letter
在某些情况下,开发人员可能会使用正则表达式来匹配其典型域之外的文本。最初的开发人员可能经历了很多次迭代,捕获了可能仅通过该迭代过程发现的各种边缘情况。因此,即使后续开发人员知道一般情况,也可能不知道原始开发人员所处理的许多极端情况。
在这种情况下,可能值得记录这些变化的示例。本文档的位置可能因数量而异(例如,不一定在代码中)。
一种解决方法是,假设未来的开发人员将仅具有基本知识,例如正则表达式的工作原理,但不具备您(1)在开发正则表达式之前所未必知道的任何知识。未来的开发人员或(2)您在开发过程中获得的知识(例如,发现的边际案例)。
例如,如果在开发过程中您说类似“哦,我不知道X可以采用这种形式”,那么就值得记录一下(也许正则表达式中处理该变化的部分)。
注释应添加从代码中看不到的有用信息。
很少有应用程序需要每个最后一个周期,如果您要对海量数据集进行模式匹配,那么也许有更好的方法,也许没有,但是对于大多数情况而言,额外的执行时间并不重要。
并记住,下一个遇到您的代码并修复错误的人可能是六个月后的您,您将无法记住它应该做什么。