如何编写RegEx来捕获字符串的一部分,除非字符串以特定的模式结束



我已经开始学习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个字符的单词

最新更新