J'ai cette expression régulière qui fonctionne lorsque je la teste en PHP mais cela ne fonctionne pas en Objective C:
(?:www\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\.?((?:[a-zA-Z0-9]{2,})?(?:\.[a-zA-Z0-9]{2,})?)
J'ai essayé d'échapper aux personnages d'échappement mais cela n'aide pas non plus. Dois-je échapper à tout autre personnage?
Voici mon code dans l'objectif C:
NSMutableString *searchedString = [NSMutableString stringWithString:@"domain-name.tld.tld2"];
NSError* error = nil;
NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"(?:www\\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\\.?((?:[a-zA-Z0-9]{2,})?(?:\\.[a-zA-Z0-9]{2,})?)" options:0 error:&error];
NSArray* matches = [regex matchesInString:searchedString options:0 range:NSMakeRange(0, [searchedString length])];
for ( NSTextCheckingResult* match in matches )
{
NSString* matchText = [searchedString substringWithRange:[match range]];
NSLog(@"match: %@", matchText);
}
-- MISE À JOUR --
Cette expression régulière renvoie (en PHP) le tableau avec les valeurs "nom-domaine" et "tld.tld2" mais dans l'objectif C, je n'ai qu'une seule valeur: "nom-domaine.tld.tld2"
- MISE À JOUR 2 -
Cette expression régulière extrait "nom de domaine" et "TLD" de la chaîne:
il prend le nom de domaine valide (ne commençant ni ne se terminant par '-' et comprenant entre 2 et 63 caractères), et jusqu'à deux parties d'un TLD si les parties sont valides (au moins deux caractères contenant uniquement des lettres et des chiffres)
J'espère que cette explication vous aidera.
Un NSTextCheckingResult
a plusieurs éléments obtenus en l'indexant.
[match rangeAtIndex:0];
est la correspondance complète.[match rangeAtIndex:1];
(s'il existe) est la première correspondance de groupe de capture.
etc.
Vous pouvez utiliser quelque chose comme ceci:
NSString *searchedString = @"domain-name.tld.tld2";
NSRange searchedRange = NSMakeRange(0, [searchedString length]);
NSString *pattern = @"(?:www\\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\\.?((?:[a-zA-Z0-9]{2,})?(?:\\.[a-zA-Z0-9]{2,})?)";
NSError *error = nil;
NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern: pattern options:0 error:&error];
NSArray* matches = [regex matchesInString:searchedString options:0 range: searchedRange];
for (NSTextCheckingResult* match in matches) {
NSString* matchText = [searchedString substringWithRange:[match range]];
NSLog(@"match: %@", matchText);
NSRange group1 = [match rangeAtIndex:1];
NSRange group2 = [match rangeAtIndex:2];
NSLog(@"group1: %@", [searchedString substringWithRange:group1]);
NSLog(@"group2: %@", [searchedString substringWithRange:group2]);
}
Sortie NSLog:
correspondance: nom-domaine.tld.tld2
nom de domaine
tld.tld2
Testez que les plages de correspondance sont valides.
Plus simplement dans ce cas:
NSString *searchedString = @"domain-name.tld.tld2";
NSRange searchedRange = NSMakeRange(0, [searchedString length]);
NSString *pattern = @"(?:www\\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\\.?((?:[a-zA-Z0-9]{2,})?(?:\\.[a-zA-Z0-9]{2,})?)";
NSError *error = nil;
NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];
NSTextCheckingResult *match = [regex firstMatchInString:searchedString options:0 range: searchedRange];
NSLog(@"group1: %@", [searchedString substringWithRange:[match rangeAtIndex:1]]);
NSLog(@"group2: %@", [searchedString substringWithRange:[match rangeAtIndex:2]]);
Swift 3.0:
let searchedString = "domain-name.tld.tld2"
let nsSearchedString = searchedString as NSString
let searchedRange = NSMakeRange(0, searchedString.characters.count)
let pattern = "(?:www\\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\\.?((?:[a-zA-Z0-9]{2,})?(?:\\.[a-zA-Z0-9]{2,})?)"
do {
let regex = try NSRegularExpression(pattern:pattern, options: [])
let matches = regex.matches(in:searchedString, options:[], range:searchedRange)
for match in matches {
let matchText = nsSearchedString.substring(with:match.range);
print("match: \(matchText)");
let group1 : NSRange = match.rangeAt(1)
let matchText1 = nsSearchedString.substring(with: group1)
print("matchText1: \(matchText1)")
let group2 = match.rangeAt(2)
let matchText2 = nsSearchedString.substring(with: group2)
print("matchText2: \(matchText2)")
}
} catch let error as NSError {
print(error.localizedDescription)
}
sortie d'impression:
correspondance: nom-domaine.tld.tld2
matchText1: nom-de-domaine
matchText2: tld.tld2
Plus simplement dans ce cas:
do {
let regex = try NSRegularExpression(pattern:pattern, options: [])
let match = regex.firstMatch(in:searchedString, options:[], range:searchedRange)
let matchText1 = nsSearchedString.substring(with: match!.rangeAt(1))
print("matchText1: \(matchText1)")
let matchText2 = nsSearchedString.substring(with: match!.rangeAt(2))
print("matchText2: \(matchText2)")
} catch let error as NSError {
print(error.localizedDescription)
}
sortie d'impression:
matchText1: nom-de-domaine
matchText2: tld.tld2
Selon documentation d'Apple , ces caractères doivent être entre guillemets (en utilisant \) pour être traités comme des littéraux:
* ? + [ ( ) { } ^ $ | \ . /
Il serait également utile d'expliquer ce que vous essayez de réaliser. Avez-vous des montages d'essai?