2013-07-01 1 views
2

J'ai une chaîne avec la valeur suivante:Regex nécessaire en Java pour gérer la valeur de chaîne dynamique

TOTAL DUE-DÉCLARATION 240,05911 $ Frais $ 10.00FRANCHISE SUR LE REVENU $ .172VSALES SUR LE REVENU $ .53LOCAL IMPÔT $ .23SERVICE REMISE $ 50.00PAYMENT - Remerciez vous- $ 100.00HBO + STARLET 100,00

$ Je dois diviser cette chaîne comme une paire clé/valeur.

TOTAL DUE-STATEMENT $240.05 
911 Fee $10.00 
FRANCHISE TAX $.17 
2VSALES TAX $.53 
LOCAL-TAX $.23 
SERVICE DISCOUNT -$50.00 
PAYMENT - THANK YOU -$100.00 
HBO+STARLET $100.00 

Ma valeur de chaîne sera toujours dynamique et la description est dynamique, sauf 911 Fee j'ai écrit une expression régulière comme suit. Je reçois les paires clé/valeur correctement, sauf que la description contient des chiffres et des lettres et des caractères spéciaux. Ma sortie est comme suit:

TOTAL DUE-STATEMENT $240.05 
911 Fee $10.00 
FRANCHISE TAX $.17 
SALES TAX $.53 ** Which is wrong**(Expected is 2VSALES TAX as key) 
LOCAL-TAX $.23 
SERVICE DISCOUNT -$50.00 
PAYMENT - THANK YOU- $100.00 "-" is coming as key (Expected is PAYMENT - THANK YOU) 
STARLET $100.00 **- Which is wrong** (Expected is HBO+STARLET) 

quelqu'un pourrait me aider s'il vous plaît ce que je dois changer dans ce regex?

+0

C'est une question brillante. Il a un objectif clair, un exemple de texte qui couvre tous les cas de contours que le demandeur pourrait trouver, la sortie désirée, et mon vote +1. –

Répondre

0

Considérant qu'il ya toujours deux décimales

Votre regex pourrait être simplifié pour

.+?[$]\d*[.]\d{2} 

Vous devez correspondance le motif avec regex ci-dessus ne diviser

Matcher m =Pattern.compile(regex).matcher(input); 
while(m.find()) 
{ 
m.group(); 
} 
+0

Vous allez manquer le signe négatif qui apparaît parfois avant $. – dda

+0

@dda ** NO ** .. ce ne sera pas ... – Anirudha

+0

@dda ce RegEx correspondra aux lignes que l'OP veut séparer. Le seul problème est que OP a une sortie désirée contenant des espaces avant le '$' que cela ne permettra pas facilement. –

2

Exemple: http://regexr.com?35dsq

Utilisez cette RegEx

/([-]{0,1}\$\d*\.\d\d)/g 

Il trouve un $ suivi d'un nombre de chiffres, puis un . puis 2 chiffres.

Ensuite, dans votre utilisation remplacer

\1\n 
+0

Vous allez manquer le signe négatif qui apparaît parfois avant $. – dda

+0

@dda Merci pour cela. Devrait être réparé maintenant. –

+1

Pourquoi le vote négatif? Dans l'exemple, l'entrée correspond exactement à la sortie attendue. –

-1

Cela devrait le faire:

^(.+) (-?\$\d*\.\d\d)$ 

La seconde moitié du regex correspond au montant en dollars, y compris en option - signe. La première partie prend tout le reste sauf l'espace de séparation.

+0

oups ... vous utilisez '^', '$' ... cela fonctionnerait-il? – Anirudha

+0

Fonctionne pour moi avec le texte fourni par l'OP - lignes séparées. – dda

+0

nup..it gagné; t travail – Anirudha

0

En tant que votre format de prix est connu, chercher, et tout le reste est la description:

String in = "TOTAL DUE-STATEMENT$240.05911 Fee$10.00FRANCHISE TAX$.172VSALES TAX$.53LOCAL-TAX$.23SERVICE DISCOUNT-$50.00PAYMENT - THANK YOU-$100.00HBO+STARLET$100.00"; 
    Pattern price = Pattern.compile("-?\\$\\d*\\.\\d{2}"); 
    Matcher matcher = price.matcher(in); 
    int offset = 0; 
    while (matcher.find(offset)) { 
     String description = in.substring(offset, matcher.start()); 
     String value = matcher.group(); 
     System.out.println(description + " " + value); 
     offset = matcher.end(); 
    } 
0
class Main { 
    public static void main(String[] args) { 
     String test = "TOTAL DUE-STATEMENT$240.05911 Fee$10.00FRANCHISE TAX$.172VSALES TAX$.53LOCAL-TAX$.23SERVICE DISCOUNT-$50.00PAYMENT - THANK YOU-$100.00HBO+STARLET$100.00"; 
     java.util.regex.Pattern p = java.util.regex.Pattern.compile("(?<KEY>.+?(?=-?\\$[\\d,]*\\.\\d{2}))(?<VAL>-?\\$[\\d,]*\\.\\d{2})"); 
     java.util.regex.Matcher m = p.matcher(test); 
     while(m.find()) { 
      System.out.println(m.group("KEY") + " : " + m.group("VAL")); 
     } 
    } 
} 

Vous avez juste besoin d'un match non avide de la touche +.? et puis un lookahead pour la valeur qui se terminera toujours dans un point et 2 chiffres pour les cents.

1

Description de

Cette solution d'expression régulière suppose la colonne d'argent a parfois un préfixe - mais contient toujours un $ suivi de zéro ou plusieurs chiffres, un point, et exactement 2 chiffres. Le reste des personnages font partie d'un nom.

([^$]*?)(-?\$\d*\.\d{2})

enter image description here

Chaque groupe de capture 1 aura le nom, et le groupe de capture 2 aura la valeur en dollars.

Exemples:

Exemple de travail: http://www.rubular.com/r/9ODCQXyFoZ

Exemple de texte

TOTAL DUE-STATEMENT$240.05911 Fee$10.00FRANCHISE TAX$.172VSALES TAX$.53LOCAL-TAX$.23SERVICE DISCOUNT-$50.00PAYMENT - THANK YOU-$100.00HBO+STARLET$100.00 

du code Java

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 
class Module1{ 
    public static void main(String[] asd){ 
    String sourcestring = "source string to match with pattern"; 
    Pattern re = Pattern.compile("([^$]*?)(-?\\$\\d*\\.\\d{2})",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
    Matcher m = re.matcher(sourcestring); 
    int mIdx = 0; 
    while (m.find()){ 
     for(int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++){ 
     System.out.println("[" + mIdx + "][" + groupIdx + "] = " + m.group(groupIdx)); 
     } 
     mIdx++; 
    } 
    } 
} 

Groupes de capture

$matches Array: 
(
    [0] => Array 
     (
      [0] => TOTAL DUE-STATEMENT$240.05 
      [1] => 911 Fee$10.00 
      [2] => FRANCHISE TAX$.17 
      [3] => 2VSALES TAX$.53 
      [4] => LOCAL-TAX$.23 
      [5] => SERVICE DISCOUNT-$50.00 
      [6] => PAYMENT - THANK YOU-$100.00 
      [7] => HBO+STARLET$100.00 
     ) 

    [1] => Array 
     (
      [0] => TOTAL DUE-STATEMENT 
      [1] => 911 Fee 
      [2] => FRANCHISE TAX 
      [3] => 2VSALES TAX 
      [4] => LOCAL-TAX 
      [5] => SERVICE DISCOUNT 
      [6] => PAYMENT - THANK YOU 
      [7] => HBO+STARLET 
     ) 

    [2] => Array 
     (
      [0] => $240.05 
      [1] => $10.00 
      [2] => $.17 
      [3] => $.53 
      [4] => $.23 
      [5] => -$50.00 
      [6] => -$100.00 
      [7] => $100.00 
     ) 

) 
Questions connexes