正则表达式 - 理解否定字符类

问题描述:

当我查看正则表达式的权威教程网站时,否定字符类的定义总是类似于“匹配不在列表中的所有字符”。然而在这个简单的例子中:"abc;xyz" -match "([^;]+)",我希望匹配是“abcxyz”,但不是(匹配所有不是分号的字符)。那么这个定义应该“匹配不在列表中的所有字符,而只是直到它在列表中找到一个字符”?正则表达式 - 理解否定字符类

+1

试试''aba'''和正则表达式'a +'。它与否定性格类没有关系。 – 2014-09-26 04:17:41

它应该是“匹配任何字符不在列表中”或“匹配字符当且仅当它不在列表中”。要认识到的重要一点是角色类只会匹配单个角色。

在你的例子中,你匹配多个字符,因为你添加了+。对于任何正则表达式r,正则表达式r+匹配r的一个或多个连续匹配。因此,[^;]+匹配abc,因为这是“abc; xyz”中最大的最早的子字符串,其中每个字符匹配[^;]

请注意,任何正则表达式都不会匹配不存在的子字符串。因为“abcxyz”不是“abc; xyz”的子字符串,所以没有匹配“abc; xyz”中的“abcxyz”的正则表达式。

+0

所以当使用量词时,它只会返回一个连续的子串?这是不是在正则表达式“替换”功能,例如[this](http://blogs.technet.com/b/heyscriptingguy/archive/2007/08/31/how-can-i-remove-all -the-non-alphabetic-characters-in-a-string.aspx)建议一个表达式可以匹配多个子字符串甚至单个字符。 – Lembasts 2014-09-26 04:36:36

+1

@Lembasts正则表达式的匹配只会是一个连续的子字符串。根据你的语言/正则表达式库,有一些函数需要一个正则表达式并返回它的第一个匹配项,然后有一些函数采用正则表达式并返回所有不重叠的匹配项。同样,也有一些功能可以取代单个比赛,然后是替换每场比赛的功能。这仅仅取决于你正在使用的功能。 – sepp2k 2014-09-26 04:39:30

+0

谢谢。对于另一个扩展解释,我只是发现[this](http://www.rexegg.com/regex-quantifiers.html#longest_shortest) – Lembasts 2014-09-26 05:37:55

正则表达式引擎匹配'a'。然后它贪婪地匹配'b',接着是'c'的贪婪匹配。

然后,正则表达式引擎命中';'并且不能再进一步,所以只有'abc'被匹配。