J'essaie de faire correspondre les URL qui commencent par "example.com/" et sont suivies de 4 à 6 chiffres et le caractère suivant n'est pas un chiffre (s'il y a un caractère suivant) .
Par exemple, "example.com/12345" doit correspondre.
"example.com/1234567" ne doit pas correspondre.
"example.com/123456g7" doit correspondre.
J'ai essayé "example.com/(\d{4,6}).*" mais cela correspond quand je le donne "example.com/1234567" code> qui est incorrect.
Comment résoudre ce problème?
3 Réponses :
Juste recherche anticipée négative pour un chiffre après avoir mis en correspondance 4 à 6 chiffres:
example.com\/\d{4,6}(?!\d).*
Une autre façon de le faire.
^ exemple \ .com / (\ d {4,6}) (?: \ D. *)? $
Que signifie le signe deux-points dans (?: \ D. *) ?
@ user101 - Il fait partie d'un (?: à 3 caractères au début d'une construction de groupe sans capture. Dans ce cas, il est utilisé pour indiquer au moteur que son contenu est \ D. * < / code>, en tant que groupe, sont facultatifs.
Cette expression ajoute des limites supplémentaires juste pour passer en toute sécurité les URL souhaitées:
# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
regex = r"^(https?:\/\/(www.)?)(example\.com)\/(?:[0-9]{4,6})?([a-z].*)?$"
test_str = ("http://example.com/12345\n"
"https://example.com/123456g7\n"
"http://www.example.com/12345\n"
"https://www.example.com/123456g7\n"
"http://www.example.com/12345\n"
"https://www.example.com/123456g7\n"
"http://www.example.com/123456adfasdfasdf98989898\n"
"https://www.example.com/123456g7adfadfa0909009\n"
"http://example.com/1234567\n"
"https://example.com/1234567")
matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
for groupNum in range(0, len(match.groups())):
groupNum = groupNum + 1
print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))
# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
Si vous le souhaitez, vous pouvez réduire les limites. Ici, nous pouvons ajouter plusieurs groupes de capture pour être simples à appeler.
$ est la clé qui échoue vos entrées d'URL indésirables.
Si ce n'était pas l'expression souhaitée, vous pouvez modifier / changer vos expressions dans regex101.com .
Vous pouvez également visualiser vos expressions dans jex.im : p >
const regex = /^(https?:\/\/(www.)?)(example\.com)\/(?:[0-9]{4,6})?([a-z].*)?$/gm;
const str = `http://example.com/12345
https://example.com/123456g7
http://www.example.com/12345
https://www.example.com/123456g7
http://www.example.com/12345
https://www.example.com/123456g7
http://www.example.com/123456adfasdfasdf98989898
https://www.example.com/123456g7adfadfa0909009
http://example.com/1234567
https://example.com/1234567`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
^(https?:\/\/(www.)?)(example\.com)\/(?:[0-9]{4,6})?([a-z].*)?$