我有以下字符串:
string = 1231231223123131_FILE_NAME.EXTENSION.OTHEREXTENSION
以及以下正则表达式:
string.match(/^\d+_([^.]+\.[^.]+)/)[1]
正则表达式返回:
=> FILE_NAME.EXTENSION
虽然我知道^ \ d + _表示找到一个或多个数字后跟一个下划线,但我的困惑在于捕获组。特别是为什么[^。] +似乎在一段时间之前返回一个或多个字符然后包括句点,但是用[^。] +
的第二个实例排除第二个句号当您删除第一个[^。] +时,这个正则表达式组合会更加混乱,因为它也会返回.OTHEREXTENSION。
根据我的理解,使用括号内的胡萝卜[^。]意味着排除它后面的任何内容。那么为什么在这个例子中它包括第一个时期之前和之后的所有角色呢?
答案 0 :(得分:2)
在正则表达式中,您有[^.]+\.[^.]+
[^.]+
代表与FILE_NAME
匹配的一个或多个非句点字符,并在到达句号.
时停止
\.
与单个句点.
匹配(FILE_NAME
之后但EXTENSION.OTHEREXTENSION
之前)。
下一个[^.]+
再次匹配一个或多个非句点字符,即EXTENSION
,并在达到句点.
时再次停止< / p>
答案 1 :(得分:1)
您的捕获组称任何字符不是.
,而是单个.
,而是另一组非.
个字符。结果中的.
不是来自第一个[^.]+
,它来自跟随它的\.
,并且仍在捕获组内。
FILE_NAME.EXTENSION
符合该标准。 FILE_NAME
匹配第一个字符类1次或更多次。接下来是一个匹配\.
的点然后单词EXTENSION
与第二个字符类相遇一次或多次。当它到达第二个点时,捕获组结束,因为正则表达式不包含任何进一步匹配的第二个.