12
votes

Regex: limite de mot mais pour l'espace blanc, début de ligne ou fin de ligne uniquement

Je cherche une limite de mot pour couvrir ces 3 cas:

  1. début de chaîne li>
  2. fin de chaîne li>
  3. espace blanc li> ol>

    Y a-t-il quelque chose comme ça depuis \ B Covers aussi -, / etc./p.pokewould souhaitera remplacer \ B dans ce motif par quelque chose décrit ci-dessus: p>

    (\b\d*\sx\s|\b\d*x|\b)
    


5 commentaires

[\ s ^ $] fais-il ce dont vous avez besoin? En outre, cela peut aider à indiquer ce que vous utilisez le moteur de regex.


@Larsh: le caret et le dollar sur les crochets comme indiqué sont des caractères simples, pas des métacaractères.


En fait, je crois que à l'intérieur des crochets, le ^ n'est qu'un métacaracter différent. Il annule une valeur, alors [^ f] correspondra à tout sauf "F"


@gnomed: Seulement si c'est le premier caractère à l'intérieur des crochets.


@Jonathan, ok. Je pensais que c'était peut-être c'était le cas ... Je ne me souvenais pas.


3 Réponses :


13
votes

OK, votre vraie question est la suivante:

Comment puis-je correspondre à une unité, éventuellement précédée d'une quantité, mais uniquement s'il n'y a rien ou un espace juste avant la correspondance?

Utilisation xxx

explication

(? : affirme qu'il est impossible de Faites correspondre un caractère non-espace avant la correspondance.

\ b : correspond à une limite de mot

(?: \ d + \ s * x \ s *)? : correspond éventuellement à un quantifier (entiers uniquement)

\ d + (?: \. \ d +)? : Correspondre un numéro (Décimales en option )

\ s * ml \ b : Match ml , éventuellement précédé de blancheur.


5 commentaires

Peut-être que si vous pouviez expliquer ce que vous voulez vraiment faire. Quel problème essayez-vous de résoudre?


J'ai posté mon modèle ci-dessus, je voulais juste remplacer \ b par cette limite de mot limitée si possible.


Ce n'est pas ce que «expliquer quel problème vous essayez de résoudre» signifie. De quoi avez-vous besoin de la regex pour ? Montrez quelques exemples de ce que vous essayez de faire correspondre, ce que vous essayez pas pour correspondre, et éventuellement toute autre "règles" les matchs doivent suivre.


a l'air sympa mais ne correspond pas aux flotteurs I.E. 1.50 ml


Ok, a changé la regex pour accueillir cela. Vous devez connaître et indiquer vos besoins clairement - vous n'avez rien dit de flotteurs avant ...



1
votes

Les limites que vous obtenez avec \ b sont non sensibles aux espaces. Ce sont des assertions conditionnelles compliquées liées à la transition entre \ w \ w ou \ w \ w . Voir Cette réponse Pour savoir comment écrire votre ancre plus précisément, afin que vous puissiez traiter avec des espaces de votre choix.


0 commentaires

25
votes

Essayez de remplacer \ b avec (?: ^ | \ S | $)

(PRE> xxx < p> travaille pour moi en Python et JavaScript.


5 commentaires

En JavaScript, le groupe externe comprend tout, y compris le groupe de non-capture. À l'aide d'Exec (), je peux obtenir le 2e groupe, qui exclut le groupe non capturant, mais comment puis-je utiliser cela dans Remplacer () dans JavaScript?


Fonctionne parfaitement dans .NET - merci! C'est exactement ce que je cherchais. (La regex que j'essaie de faire correspondre entre les espaces / début / la fin de la ligne est différente, mais le comportement "Match WhitSpace ou début de ligne" est exactement ce que je cherchais.)


@Fernandocamargo J'essaie de comprendre la même chose à l'aide de Remplacer () en JavaScript


@Kdawgwilk Avez-vous trouvé une solution? Je suis confronté exactement au même problème


@Jordane je verrai si je peux le trouver demain et je vous ferai savoir