我已经开始学习RegexOne,其中有一个练习,我们必须捕获一段字符串,直到",只要字符串以.pdf 结尾
match file_a_record_file.pdf
match file_yesterday.pdf
skip testfile_fake.pdf.tmp
但我想更深入一点,捕捉这段字符串,除非字符串在句点后面包含3个以上的字符">
我试过使用
^(w+(?!([.](.{4,}))$))
但它当然不起作用。考虑到JavaScriptRegEx库,我该如何纠正这种模式?(如果可能的话,我不想要函数,只想要模式(。我想如果我能避免使用$,它会更灵活,但我会接受任何与问题匹配的答案。提前谢谢大家。
您可以检查一个点后是否有不超过4个非点字符。
^(?!.*.[^.n]{4})w+(?:.w+)*$
Regex演示
const regex = /^(?!.*.[^.n]{4})w+(?:.w+)*$/;
[
"file_a_record_file.pdf",
"file_yesterday.pdf",
"testfile_fake.pdf.tmp",
"testfile_fake.docx.tmp"
].forEach(s => {
console.log((regex.test(s) ? "Match: " : "No match: ") + s);
});
如果你想要pdf之前的零件,如果它应该以pdf结尾,你可以使用一个捕获组,并在结尾匹配.pdf
。
^(?!.*.[^.n]{4})(w+(?:.w+)*).pdf$
Regex演示
const regex = /^(?!.*.[^.n]{4})(w+(?:.w+)*).pdf$/;
[
"file_a_record_file.pdf",
"file_yesterday.pdf",
"testfile_fake.pdf.tmp",
"testfile_fake.docx.tmp"
].forEach(s => {
const m = s.match(regex);
if (m) {
console.log(m[1]);
}
});
我相信这就是你想要做的:
mySting.match(/(.*).pdf$/)
Match file_a_record_file.pdf
Match file_yesterday.pdf
null testfile_fake.pdf.tmp
编辑:不带扩展名的字符串存储在mySting.match(/(.*).pdf$/)[1]
上
对于3个字符匹配后的第一个点
myString.match(/^([^.]+).[w]{1,3}$/);
说明:匹配所有非点+匹配第一个点+匹配字符串末尾包含1到3个字符的单词