2009-09-07 7 views
1

Supposons que j'ai des chaînes comme les suivantes:Comment puis-je le marquer avec une regex?

OneTwo 
ThreeFour 
AnotherString 
DVDPlayer 
CDPlayer 

Je sais comment tokenize les chameaux cas, à l'exception du « DVDPlayer » et « CDPlayer ». Je sais que je pourrais les marquer manuellement, mais peut-être pourriez-vous me montrer une regex capable de gérer tous les cas?

EDIT: les jetons attendus sont:

OneTwo -> One Two 
... 
CDPlayer -> CD Player 
DVDPlayer -> DVD Player 
+1

Et les jetons vous attendez-vous dans ce cas? – Gumbo

+1

Un, Deux; Trois quatre; Un autre, String; Lecteur de DVD; CD, Player – Joey

Répondre

4

Regardez ma réponse à la question .NET - How can you split a “caps” delimited string into an array?.

Le regex ressemble à ceci:

/([A-Z]+(?=$|[A-Z][a-z])|[A-Z]?[a-z]+)/g 

Il peut être légèrement modifié pour permettre la recherche de jetons de-camel, en remplaçant le $ avec \b:

/([A-Z]+(?=\b|[A-Z][a-z])|[A-Z]?[a-z]+)/g 
+0

Ce dernier est presque équivalent à la réponse de Gumbo. La seule différence est que cela accepte aussi les mots commençant par des minuscules. "camelCase" -> ["camel", "Case"] –

0

Essayez un regard non gourmand en avance. Un jeton serait constitué d'une ou plusieurs lettres majuscules suivies de zéro ou plusieurs caractères minuscules. Le jeton se terminerait lorsque les deux caractères suivants sont en majuscules et minuscules - correspondant à cette section est ce que la correspondance non gourmande peut être utilisée. Cette approche a des limites, mais cela devrait fonctionner pour les exemples que vous avez fournis.

+0

+1 parce que vous y êtes arrivé en premier - bien qu'un exemple vous ait peut-être poussé dans le classement "utile" :) –

4

Essayez cette expression régulière:

[A-Z](?:[a-z]+|[A-Z]*?(?=[A-Z][a-z]|\b)) 
1

La regex

([A-Z]+[a-z]*)([A-Z][a-z]*) 

ferait ce que vous voulez en supposant que toutes vos chaînes sont de 2 mots et le second mot n'est pas comme DVD.

I.e. cela fonctionnerait pour vos exemples mais peut-être pas pour ce que vous essayez réellement de faire.

1

Voilà ma tentative:

([A-Z][a-z]+)|([A-Z]+(?=[A-Z][a-z]+)) 
Questions connexes