我有以下字符串:
string = 1231231223123131_FILE_NAME.EXTENSION.OTHEREXTENSION以及以下正则表达式:
string.match(/^\d+_([^.]+\.[^.]+)/)[1]正则表达式返回:
=> FILE_NAME.EXTENSION虽然我了解到^\d+_表示的是多个数字中的一个,后面跟着一个下划线,但我的困惑是在捕获组中。特别是为什么^.+似乎在句点之前返回一个或多个字符,然后包括句点,但不包括第二个句点和第二个^.+实例。
当您移除第一个^.+时,这个正则表达式组合更加令人困惑,因为它还返回.OTHEREXTENSION。
根据我的理解,在圆括号中使用胡萝卜^。意思是排除跟在后面的任何东西。那么,为什么在这种情况下,它包括到第一个句点之前和之后的所有字符?
发布于 2018-03-24 04:12:40
捕获组表示任何不是.的字符,然后是单个.,然后是另一组非.字符。结果中的.不是来自第一个[^.]+,而是来自后续的\.,并且仍然在捕获组中。
FILE_NAME.EXTENSION符合这一标准。FILE_NAME匹配第一个字符类1或更多次。后面跟着一个与\.匹配的点,然后单词EXTENSION会遇到第二个字符类一次或多次。当它到达第二个点时,捕获组就结束了,因为正则表达式不包含与第二个.匹配的任何内容。
发布于 2018-03-24 04:14:14
在您的正则表达式中,您有[^.]+\.[^.]+
[^.]+代表一个或多个与FILE_NAME匹配的非句点字符,并在到达句点.时停止。
\.匹配单个句点.,它会这样做(在FILE_NAME之后,但在EXTENSION.OTHEREXTENSION之前)。
下一个[^.]+再次匹配一个或多个非周期字符,即EXTENSION,并在到达句点.时再次停止。
https://stackoverflow.com/questions/49461016
复制相似问题