I need to match if filenames have exactly 1 underscores. For example:
Prof. Leonel Messi_300001.pdf -> true
Christiano Ronaldo_200031.xlsx -> true
Eden Hazard_3322.pdf -> true
John Terry.pdf -> false
100023.xlsx -> false
300022_Fernando Torres.pdf -> false
So the sample : name_id.extnames
Note : name is string and id is number
I try like this : [a-zA-Z\d] _[0-9\d]
Is my regex correct?
CodePudding user response:
As the filename will be name_id.extension, as name string or space [a-z\s] ? then underscore _, then the id is a number [0-9] ?, then the dot, as dot is a special character you need to scape it with backslash \., then the extension name with [a-z]
const checkFileName = (fileName) => {
const result = /[a-z\s] ?_\d ?\.[a-z] /i.test(fileName);
console.log(result);
return result;
}
checkFileName('Prof. Leonel Messi_300001.pdf')
checkFileName('Christiano Ronaldo_200031.xlsx')
checkFileName('Eden Hazard_3322.pdf')
checkFileName('John Terry.pdf')
checkFileName('100023.xlsx')
checkFileName('300022_Fernando Torres.pdf')
CodePudding user response:
[a-zA-Z] _[0-9\d]
or
[a-zA-Z] _[\d]
CodePudding user response:
You should use ^...$ to match the line. Then just try to search a group before _ which doesn't have _, and the group after, without _.
^(?<before>[^_]*)_(?<after>[^_]*)\.\w $
https://regex101.com/r/ZrA7B1/1
CodePudding user response:
Regex
My try with separate groups for
name: Can contain anything. Last_occurrence should be the endid: Can contain only numbers. Last_occurrence should be the startext: Before last.. Can only containa-zand should be more than one character.
/^(?<name>. )\_(?<id>\d )\.(?<ext>[a-z] )/g
JS
const fileName = "Lionel Messi_300001.pdf"
const r = /^(?<name>. )\_(?<id>\d )\.(?<ext>[a-z] )/g
const fileNameMatch = r.test(fileName)
if (fileNameMatch) {
r.lastIndex = 0
console.log(r.exec(fileName).groups)
}
See CodePen
