2011-07-22 2 views
1
const string strRegex = @"(?<city_country>.+) ?(bis|zu)? (?<price>[\d.,]+) eur"; 
      searchQuery = RemoveSpacesFromString(searchQuery); 
      Regex regex = new Regex(strRegex, RegexOptions.IgnoreCase); 

      Match m = regex.Match(searchQuery); 
      ComplexAdvertismentsQuery query = new ComplexAdvertismentsQuery(); 

      if (m.Success) 
      { 
       query.CountryName = m.Groups["city_country"].Value; 
       query.CityOrAreaName = m.Groups["city_country"].Value; 
       query.PriceFrom = Convert.ToDecimal(1); 
       query.PriceTo = Convert.ToDecimal(m.Groups["price"].Value); 
      } 
      else 
       return null; 

      return query; 

ma chaîne de recherche est "Agadir environ 600 eur" mais "ca." n'est pas "bis" ou "zu" et regex est également vrai. Quel est le problème avec regex? Je veux que regex est vrai seulement si le mot "bis" ou "zu".problème regex C#

Je pense que cela worng

?(bis|zu)? 

Répondre

1

Supprimez le point d'interrogation dans (bis|zu)?. Comme il est en ce moment, le .+ de <city_country> correspond aux prix et comprend ca..

En fait, vous voudrez peut-être changer toute la partie ?(bis|zu)? en (bis| zu).

+0

quelle est la différence entre (bis | zu) et (bis | zu) +. Est le même? – senzacionale

+0

'(bis | zu) +' Correspondra à n'importe quelle séquence de 1 ou plus 'bis' ou' zu'. Quelque chose comme 'bis bis bis zu bis zu zu bis' correspondrait. EDIT: Ah, mais vous semblez enlever les espaces de la chaîne après, donc vous pouvez vous débarrasser de tous les espaces dans l'expression rationnelle. – Vache

+0

thx. Pourquoi écrivez-vous alors? +? – senzacionale

3

Agadir ca. devient votre city_country et (bis|zu)? partie est ignorée que vous avez marqué comme non nécessaire avec ?.

+0

Also becau Il a marqué l'espace entre city_country et (bis | zu)? comme optionnel. Supprimer cet espace facultatif provoquerait également l'échec de la correspondance. – CodingGorilla

+2

C'est difficile à dire, son appel à 'RemoveSpacesFromString' vous amène à penser que la chaîne n'aura jamais d'espaces, quoi qu'il arrive. Mais c'est un bon point. – CodingGorilla

2

On dirait que c'est parce que vous avez fait bis et zu optionnel. Essayez de remplacer (bis|zu)? par (bis|zu)

0
(?<city_country>.+) ?(bis|zu)? (?<price>[\d.,]+) eur 
        ^ ^
        1  2 
  1. Le premier ? appartient à l'espace avant

  2. Le deuxième ? appartient à la (bis|zu)

Le ? dans ces deux cas fait l'expression avant facultatif