【发布时间】:2022-01-02 23:49:30
【问题描述】:
我知道get file extensions with JavaScript 有更简单的方法,但部分是为了练习我的正则表达式技能,我想尝试使用正则表达式将文件名分成两个字符串,在最后一个点之前和之后(. 字符) .
这是我目前所拥有的
const myRegex = /^((?:[^.]+(?:\.)*)+?)(\w+)?$/
const [filename1, extension1] = 'foo.baz.bing.bong'.match(myRegex);
// filename1 = 'foo.baz.bing.'
// extension1 = 'bong'
const [filename, extension] = 'one.two'.match(myRegex);
// filename2 = 'one.'
// extension2 = 'two'
const [filename, extension] = 'noextension'.match(myRegex);
// filename2 = 'noextension'
// extension2 = ''
我尝试使用否定前瞻来表示“仅匹配文字”。如果后面跟着一个以这样结尾的单词,则将(?:\.)* 更改为(?:\.(?=\w+.))*:
/^((?:[^.]+(?:\.(?=(\w+\.))))*)(\w+)$/gm
但我想仅使用正则表达式来排除最后一个时期,并且最好在初始组中匹配“noextension”,我该如何仅使用正则表达式来做到这一点?
这是我的正则表达式临时文件:https://regex101.com/r/RTPRNU/1
【问题讨论】:
-
您只能使用
^(\w+(?:\.\w+)*?)(?:\.(\w+))?$匹配单词字符,其中.和单词字符可选重复。见https://regex101.com/r/lMsjRj/1 -
@WiktorStribiżew 因为我没想到
-
@Thefourthbird 这也是一个完全有效的答案
-
@Pureferret 我发布了一个答案。您可以等待 Wiktor 发布他的解决方案并接受,因为他首先解决了问题。
-
@Pureferret ...不用环顾四周,更明确和准确的东西怎么样...
/^(?<noextension>\w+)$|(?<filename>\w+(?:\.\w+)*)\.(?<extension>\w+)$/或没有命名组.../^(\w+)$|(\w+(?:\.\w+)*)\.(\w+)$/
标签: javascript regex regex-lookarounds capture-group