2012-08-05 5 views
1

que j'ai un fichier qui contient des lignes comme suit:Regex - string analyse syntaxique

Hayden 
y 

Supposons que je veuille manipuler la ligne qui ne contient que « y » et non celui avec Hayden, comment pourrais-je faire ? Donc je lis dans le fichier et je l'analyse ligne par ligne. Je veux dire si la ligne contient des lettres avant ou après "y" alors ce n'est pas la ligne que je cherche.

Je pensais que je pouvais faire ce qui suit:

String value = "y"; 
if(strLine.matches("[a-zA-Z]" + value + "[a-zA-Z]")) 
{ 
     don't manipulate line here 
} 
else 
{ 
    manipulate string here 
} 

Cependant, cela devient "Hayden" ainsi que "y"

Toutes les idées?

EDIT

désolé, je aurais dû être plus clair, si je ne me dérange pas s'il y a des espaces ou des symboles devant? ou derrière? C'est précisément les lettres que je dois surveiller. Par exemple, je ne peux pas avoir YH mais je peux avoir y = ... encore désolé

Répondre

1

Peut-être que c'est ce que vous cherchez

String[] lines={"Hayden","y"," y*","y=","y+"," +y..."}; 
for (String s:lines) 
    System.out.println(s+"->"+s.matches("\\W*y\\W*")); 

sortie:

Hayden->false 
y->true 
y*->true 
y=->true 
y+->true 
+y...->true 
+0

hmm mais qu'en est-il avoir quelque chose comme y = ou y + ou + y ... je pense que cela échouerait dans ce cas ... mais ces lignes sont ok pour moi. c'est juste s'il y a une lettre directement à côté de y - de chaque côté, que je veux éviter .. – BigBug

+0

@BlueMonster vérifier mon édition et voir si c'est ok – Pshemo

+0

merci :) cela a effectivement fonctionné. homme plutôt cool. Merci encore – BigBug

4

Vous pouvez utiliser lookarounds négatif:

if (strLine.matches("^.*(?<![a-zA-Z])y(?![a-zA-Z]).*$")) { 
    // manipulate string here 
} 

Les ancres sont facultatifs, mais de toute façon inclus pour plus de clarté.

+0

c'est probablement le e asiest moyen de montrer si la ligne contient seulement y (et vous pouvez également utiliser "equalsIgnoreCase()" – DMor

+0

désolé, j'aurais dû être plus clair, et si je ne me dérange pas s'il y a des symboles? ou des espaces en face? – BigBug

+0

cela fonctionne presque ... mais pour une raison quelconque, il n'attrape pas y = y + y ... hwo pourrais-je contourner cela?comme je l'ai dit, je ne me dérange pas il y avoir des symboles ou des espaces ... ne peut pas avoir des lettres juste à côté .. merci pour la réponse btw – BigBug

3

Vous pouvez utiliser:

strLine.matches("^y$") 

Pour ignorer les symboles, à savoir les caractères non-alphanumériques, utilisez:

strLine.matches("^\\W*y\\W*$") 
+0

désolé, j'aurais dû être plus clair, et si ça ne me dérange pas s'il y a des espaces ou des symboles devant? ou derrière? C'est précisément les lettres que je dois surveiller. Par exemple, je ne peux pas avoir yh mais je peux avoir y = ... désolé encore – BigBug

+0

ok, ont ajouté une nouvelle expression – Reimeus

+0

merci c'était presque ce que je cherchais +1 – BigBug

0

Si vous allez utiliser regex, vous devez être un peu plus précis :

  • y correspond à y n'importe où dans la ligne.
  • ^y$ correspond à y qui est juste avant la fin de la chaîne (le signe dollar) et juste après le début de la chaîne (le signe insertion). Cela vous permet de faire correspondre la ligne égale à y.
0

L'extension de l'approche égaux: il suffit de supprimer tout le caractère ne vous dérange pas, puis vérifier égalité avec "y":

if (strLine.replaceAll("[^a-zA-Z]", "").equals("y")) { 
    ... 
} 
+0

Je ne peux pas enlever les lettres que je ne veux pas ... ils doivent rester là ... je dois juste les contourner ... parce que je ne veux pas manipuler ces lignes ... – BigBug

+0

replace() ne manipule rien, il renvoie une nouvelle chaîne. La condition est de lire "si je devais enlever tout ce qui n'est pas aZ et que le reste est juste un" y ", fais ..." – Bergi

+0

mais je ne veux rien faire avec la ligne qui contient d'autres lettres .... seulement si la ligne contient la lettre que je cherche et des symboles ou des espaces ... dans un tel cas, je voudrais manipuler la chaîne. Cependant, si je retire tout et puis vérifie s'il y a un "y" comment puis-je déterminer que ceci est ou n'est pas une ligne contenant juste la lettre que je cherche et les symboles (le cas échéant) - bien qu'il n'y ait pas nécessairement être des symboles ... – BigBug