所以,我有这个正则表达式,它当前匹配字符串中的最后一个空格及其后续单词:
var regex = /\s+\S*$/m
例如:
'this match'.match(regex) == [" match"]
但是,如果整个字符串只是一个空白字符,然后是单词字符,它仍然匹配。 (例如' match'
)
我已经尝试了"not followed by" quantifier,但我最接近的是匹配我首选输出的倒数:
var regex = /\S+(?=\s+\S*$)/m
'this match'.match(regex) == ["this"]
我希望这只匹配一个空格,然后一个单词,如果该匹配后跟任意数量的单词字符
所以我希望它与最后一个空格和单词匹配:'multiple words'
但根本不匹配:' word'
编辑:我应该补充一点,我打算使用search()方法(或类似的东西)来获取匹配开头的字符索引。我仅使用上面的match()方法进行说明。
答案 0 :(得分:2)
您可以使用以下内容:
/.(\s\w+)/
这将匹配任何字符后跟一个空格字符,后跟一个或多个单词字符,在组1中捕获。然后您只需要提取该组。例如:
'multiple words'.match(/.(\s\w+)/)[1] // " words"
' word'.match(/.(\s\w+)/) // null
请注意,我在此模式中使用了.
,因为问题对于您想要不匹配的内容有点模糊,仅引用“只是一个空白字符,然后是单词字符”。如果您想确保在捕获的组之前有一些单词字符,请使用以下内容:
/\w\s*(\s\w+)/
使用第一个模式获取第一个匹配的索引非常简单。只需使用search
并添加1:
'multiple words'.search(/.(\s\w+)/) + 1 // 8
' word'.match(/.(\s\w+)/) + 1 // 0 (not found)
但是如果你使用的是第二种模式,那就更困难了。 JavaScript无法提供获取每个捕获组位置的简便方法。您可以做的最好的事情是使用exec
,它将为您提供捕获组和找到匹配项的索引,然后执行以下操作:
match = /\w\s*(\s\w+)/.exec('multiple words');
index = match.index + match[0].length - match[1].length; // 8
match = /\w\s*(\s\w+)/.exec(' words'); // undefined