9
votes

Quel est le modèle pour la chaîne vide?

Je dois valider la saisie: les variantes valides sont une chaîne de nombres ou de vide. Quel est l'expression régulière correspondante? XXX

UPD: ne suggère pas "\ d *" s'il vous plaît, je suis juste curieux comment dire "string vide" dans regexp.


0 commentaires

7 Réponses :


0
votes

Il ne devrait y avoir rien de mal avec juste "\ d + |"


3 commentaires

Ce n'est pas correct. Une regex vide correspondra à la chaîne vide mais également (plusieurs fois) dans chaque chaîne non vide, à savoir chaque position avant ou après un caractère.


@TIM: Mais s'il s'agit de Java Correspondances , le motif sera corrigé contre la chaîne d'entrée totale . C'est-à-dire en Java, "bla" .matches ("") est false .


Correct. Pour clarifier, emballer en ^ et $ veillera à ce que vous parlez de la chaîne entière.



6
votes
/^\d*$/
Matches 0 or more digits with nothing before or after.Explanation:The '^' means start of line. '$' means end of line. '*' matches 0 or more occurences. So the pattern matches an entire line with 0 or more digits.

0 commentaires

16
votes

Dans ce cas particulier, ^ \ d * $ code> fonctionnerait, mais de manière générale, pour correspondre à "code> modèle code> ou une chaîne vide, vous pouvez utiliser:

String numbers = "012345";

System.out.println(numbers.replaceAll(".", "<$0>"));
// <0><1><2><3><4><5>

System.out.println(numbers.replaceAll("^.", "<$0>"));
// <0>12345

System.out.println(numbers.replaceAll(".$", "<$0>"));
// 01234<5>

numbers = "012\n345\n678";
System.out.println(numbers.replaceAll("^.", "<$0>"));       
// <0>12
// 345
// 678

System.out.println(numbers.replaceAll("(?m)^.", "<$0>"));       
// <0>12
// <3>45
// <6>78

System.out.println(numbers.replaceAll("(?m).\\Z", "<$0>"));     
// 012
// 345
// 67<8>


0 commentaires

3
votes

correspondre explicitement à la chaîne vide, utilisez \ a \ z .

Vous pouvez également voir souvent ^ $ qui fonctionne bien si l'option est définie pour autoriser le ^ et $ ancrages pour correspondre non seulement au début ou à la fin de la chaîne mais aussi au début / fin de chaque ligne. Si votre entrée ne peut jamais contenir de nouvelles lignes, alors bien sûr ^ $ est parfaitement ok.

Certaines saveurs de regex ne prennent pas en charge \ a et \ z ancrages (en particulier JavaScript).

Si vous souhaitez autoriser "vide" comme dans "rien ni uniquement avec espace", puis allez pour \ a \ s * \ z ou ^ \ s * $ .


0 commentaires

1
votes

Tout comme une solution amusante, vous pouvez faire:

\d+|\d{0}


0 commentaires

0
votes

Une du chemin d'affichage à l'ensemble de la langue normale comme fermeture des choses ci-dessous:

  1. spécial est la langue habituelle li>
  2. Tout symbole de l'alphaphet est la langue régulière valide li>
  3. Toute concaténation et l'union de deux regexples valides est la langue habituelle li>
  4. Tout union de deux langues régulières valides est la langue habituelle li>
  5. Toute fermeture transitive du regexP est la langue habituelle li> ol>

    Le langage régulier en béton est un élément concret de cette fermeture. p>


    Je n'ai trouvé pas de symbole vide dans standard de POSIX pour exprimer une idée de langue régulière de l'étape (1). P>

    Mais il existe une question supplémentaire marque là-bas qui est par définition de POSIX est le suivant: p>

    (regexp | ) p> blockquote>

    Vous pouvez donc faire de la manière suivante pour Bash, Perl et Python: P>

    echo 9023 | grep -E "(1|90)?23"
    perl -e "print 'PASS' if (qq(23) =~ /(1|90)?23/)"
    python -c "import re; print bool(re.match('^(1|90)?23$', '23'))"
    


0 commentaires

0
votes

Pour effectuer n'importe quel motif qui correspond à une chaîne entière en option, c'est-à-dire permettre un motif correspond à une chaîne vide, utilisez un groupe optionnel : xxx

Voir le Démo Regex

Si le moteur Regex permet (comme dans Java), préférez un Groupe de non-capture depuis son objectif principal consiste uniquement aux sous-cupendes de groupe, ne conservent pas les sous-valises capturées: xxx

^ correspondra au début d'un chaîne (ou \ a peut être utilisé dans de nombreuses saveurs pour cela), $ correspondra à la fin de la chaîne (ou \ z peut être utilisé. Correspondre à la fin de nombreuses saveurs, et java, aussi), et le (....)? correspondra à 1 ou 0 (en raison du quantificateur ? quantificateur) séquences des sous-cuisses à l'intérieur des parenthèses.

une note d'utilisation Java: lorsqu'il est utilisé dans correspondant () , le ^ et la trailing $ peut être omis et vous pouvez utiliser xxx


0 commentaires