Regex pour diviser une ligne, mais avec un volume de captures

  • spork
  • Brewmaster
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Sep 22, 2003
  • Messages: 6130
  • Loc: Seattle, WA
  • Status: Offline

Message Juillet 24th, 2009, 8:31 am

Quelqu'un peut-il arriver à une expression régulière qui se divise en place une ligne en gros morceaux sur la base des règles suivantes?

Par exemple, cette ligne:
Code: [ Select ]
an example line


devraient être divisés en:
Code: [ Select ]
an
example
line
  1. an
  2. example
  3. line


Cependant, si il ya des valeurs (des mots) au sein de pare notheses, ils devraient être considérés comme une unité, donc la ligne suivante:
Code: [ Select ]
this (is) an (example of what) i am (talking about)


devrait être divisé en
Code: [ Select ]
this
is
an
example of what
i
am
talking about
  1. this
  2. is
  3. an
  4. example of what
  5. i
  6. am
  7. talking about


Et cette ligne:
Code: [ Select ]
(this is all in one big block)


ne doit pas être divisée à tous.

Ive a essayé un certain nombre d'expressions différentes, mais aucun ne semble faire l'affaire. Des suggestions, ou devrais-je écrire juste une routine pour analyser les cordes sans les expressions rationnelles?
The Beer Monocle. Classy.
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Juillet 24th, 2009, 8:31 am

  • UPSGuy
  • Lurker ಠ_ಠ
  • Web Master
  • Avatar de l’utilisateur
  • Inscription: Juil 25, 2005
  • Messages: 2735
  • Loc: Nashville, TN
  • Status: Offline

Message Juillet 24th, 2009, 9:25 am

Code: [ Select ]
 
<?php
 
$input = "this (is) an (example of what) i am (talking about)";
$pattern = '#(\(.+\)|\w+\s)#U';
 
preg_match_all($pattern,$input,$match);
 
foreach($match[0] as $m) { echo "$m<br/>"; }
 
/*
output:
this
(is)
an
(example of what)
i
am
(talking about)
*/
?>
 
  1.  
  2. <?php
  3.  
  4. $input = "this (is) an (example of what) i am (talking about)";
  5. $pattern = '#(\(.+\)|\w+\s)#U';
  6.  
  7. preg_match_all($pattern,$input,$match);
  8.  
  9. foreach($match[0] as $m) { echo "$m<br/>"; }
  10.  
  11. /*
  12. output:
  13. this
  14. (is)
  15. an
  16. (example of what)
  17. i
  18. am
  19. (talking about)
  20. */
  21. ?>
  22.  


Thats étroite, mais elle ne perd pas le pare notheses - Je pense que je peux faire qui se produisent trop, cependant.
I'd love to change the world, but they won't give me the source code.
  • UPSGuy
  • Lurker ಠ_ಠ
  • Web Master
  • Avatar de l’utilisateur
  • Inscription: Juil 25, 2005
  • Messages: 2735
  • Loc: Nashville, TN
  • Status: Offline

Message Juillet 24th, 2009, 9:44 am

Je ne peux pas imaginer un bon moyen pour supprimer les parenthèses, sans perdre le groupement. Sauf si vous êtes déterminés à s'en tenir à un simple passage, je voudrais, soit une boucle sur le tableau résultant et de supprimer la compétence parens ou peut-être faire quelque chose comme ce qui est ci-dessous et de combiner $ match [1] et $ match [2] en quelque sorte?

Code: [ Select ]
<?php

$input = "this (is) an (example of what) i am (talking about)";
$pattern = '#\((.+)\)|(\w+\s)#U';

preg_match_all($pattern,$input,$match);

foreach($match as $m) { foreach($m as $arr) { echo "$arr<br/>"; } echo "--------<br/>"; }


?>
  1. <?php
  2. $input = "this (is) an (example of what) i am (talking about)";
  3. $pattern = '#\((.+)\)|(\w+\s)#U';
  4. preg_match_all($pattern,$input,$match);
  5. foreach($match as $m) { foreach($m as $arr) { echo "$arr<br/>"; } echo "--------<br/>"; }
  6. ?>
I'd love to change the world, but they won't give me the source code.
  • spork
  • Brewmaster
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Sep 22, 2003
  • Messages: 6130
  • Loc: Seattle, WA
  • Status: Offline

Message Juillet 24th, 2009, 9:57 am

(Ce n'est pas spécifique à PHP, par la manière, il a juste besoin de PCRE).
The Beer Monocle. Classy.
  • Bogey
  • Bogey
  • Genius
  • Avatar de l’utilisateur
  • Inscription: Juil 14, 2005
  • Messages: 8211
  • Loc: USA
  • Status: Offline

Message Juillet 24th, 2009, 10:25 am

Le texte suivant a travaillé pour moi et un de moins en boucle :D (J'ai pratiquement fait ce que dit UPSGuy..." combiner" $ match [1] avec $ match [2])
PHP Code: [ Select ]
<?php
$input = "this (is) an (example of what) i am (talking about)";
$pattern = '#\((.+)\)|(\w+\s)#U';
 
preg_match_all($pattern,$input,$match);
 
foreach($match[1] as $key => $value)
   if(empty($value))
      echo "{$match[2][$key]}<br />";
   else
      echo "$value<br />";
?>
  1. <?php
  2. $input = "this (is) an (example of what) i am (talking about)";
  3. $pattern = '#\((.+)\)|(\w+\s)#U';
  4.  
  5. preg_match_all($pattern,$input,$match);
  6.  
  7. foreach($match[1] as $key => $value)
  8.    if(empty($value))
  9.       echo "{$match[2][$key]}<br />";
  10.    else
  11.       echo "$value<br />";
  12. ?>
"Bring forth therefore fruits meet for repentance:" Matthew 3:8
  • spork
  • Brewmaster
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Sep 22, 2003
  • Messages: 6130
  • Loc: Seattle, WA
  • Status: Offline

Message Juillet 24th, 2009, 10:27 am

Merci les gars. Im juste la recherche de l'expression si, comme Im utiliser dans un C #application, pas de PHP, de sorte que le code PHP n'est pas pertinente pour moi.
The Beer Monocle. Classy.
  • Bogey
  • Bogey
  • Genius
  • Avatar de l’utilisateur
  • Inscription: Juil 14, 2005
  • Messages: 8211
  • Loc: USA
  • Status: Offline

Message Juillet 24th, 2009, 10:31 am

Impossible d'appliquer la même logique en C #comme en l'espèce? Ou faut-il ne pas fonctionner comme ça?

Et une autre chose...ne C #a une fonction appelée "preg_callback"? Je ne sais pas si cela vous aider à le faire en C #...vient de lancer quelque chose là-bas...
"Bring forth therefore fruits meet for repentance:" Matthew 3:8
  • spork
  • Brewmaster
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Sep 22, 2003
  • Messages: 6130
  • Loc: Seattle, WA
  • Status: Offline

Message Juillet 24th, 2009, 10:36 am

C #a sa propre bibliothèque regex; ses objets et beaucoup, beaucoup mieux.
The Beer Monocle. Classy.
  • Bogey
  • Bogey
  • Genius
  • Avatar de l’utilisateur
  • Inscription: Juil 14, 2005
  • Messages: 8211
  • Loc: USA
  • Status: Offline

Message Juillet 24th, 2009, 10:41 am

spork a écrit:
C #a sa propre bibliothèque regex; ses objets et beaucoup, beaucoup mieux.

Alright...
"Bring forth therefore fruits meet for repentance:" Matthew 3:8
  • UPSGuy
  • Lurker ಠ_ಠ
  • Web Master
  • Avatar de l’utilisateur
  • Inscription: Juil 25, 2005
  • Messages: 2735
  • Loc: Nashville, TN
  • Status: Offline

Message Juillet 24th, 2009, 11:23 am

Vous devez toujours être en mesure d'extraire le modèle (et retravailler le ungreedy) à ceci: (\ (. +? \) | \ W +? \ S)
I'd love to change the world, but they won't give me the source code.
  • Rabid Dog
  • Web Master
  • Web Master
  • Avatar de l’utilisateur
  • Inscription: Mai 21, 2004
  • Messages: 3229
  • Loc: South Africa
  • Status: Offline

Message Juillet 27th, 2009, 12:27 pm

Ok je vais faire un fou de moi ici mais a décidé de toute façon

Code: [ Select ]
 
namespace Little_Utils {
  public class DisplayBlock {

    private List<String> _displayLines = new List<string>();

    private DisplayBlock(){}
   
    public static DisplayBlock CreateInstance(String inputString){
      DisplayBlock block = new DisplayBlock();
      block.Format(inputString);
      return block;
    }
   
    private void Format(String input){
      String pattern = @"(\(.+?\)|\w+?\s)";
      Regex regEx = new Regex(pattern);
      MatchCollection matches = regEx.Matches(input);
 
      for (int i = 0; i < matches.Count; i++) {
        String line = matches[i].Value.Replace("(", String.Empty).Replace(")", String.Empty).Replace(Environment.NewLine, String.Empty);
        _displayLines.Add(String.Format(line));
      }
    }
 
    public override string ToString() {
      StringBuilder builder = new StringBuilder();
      String lineFormat = "{0}" + Environment.NewLine;
     
      for (int i = 0; i < _displayLines.Count; i++) {
        String line = _displayLines[i].Replace("(", String.Empty).Replace(")", String.Empty).Replace(Environment.NewLine, String.Empty);
        if(i < (_displayLines.Count - 1)){
          builder.Append(String.Format(lineFormat, line));
        }else{
          builder.Append(line); //strip off the last new line
        }
      }
 
      return builder.ToString();
    }
   
    public String GetLine(int lineNumber){
      //this will throw an exception if the lineNumber exceeds the _displayLine count -1.
      //Catch it here or let it go to the caller.
      return _displayLines[lineNumber];
    }
   
    public int LineCount{
      get{return _displayLines.Count;}
    }
 
  }
}
 
  1.  
  2. namespace Little_Utils {
  3.   public class DisplayBlock {
  4.     private List<String> _displayLines = new List<string>();
  5.     private DisplayBlock(){}
  6.    
  7.     public static DisplayBlock CreateInstance(String inputString){
  8.       DisplayBlock block = new DisplayBlock();
  9.       block.Format(inputString);
  10.       return block;
  11.     }
  12.    
  13.     private void Format(String input){
  14.       String pattern = @"(\(.+?\)|\w+?\s)";
  15.       Regex regEx = new Regex(pattern);
  16.       MatchCollection matches = regEx.Matches(input);
  17.  
  18.       for (int i = 0; i < matches.Count; i++) {
  19.         String line = matches[i].Value.Replace("(", String.Empty).Replace(")", String.Empty).Replace(Environment.NewLine, String.Empty);
  20.         _displayLines.Add(String.Format(line));
  21.       }
  22.     }
  23.  
  24.     public override string ToString() {
  25.       StringBuilder builder = new StringBuilder();
  26.       String lineFormat = "{0}" + Environment.NewLine;
  27.      
  28.       for (int i = 0; i < _displayLines.Count; i++) {
  29.         String line = _displayLines[i].Replace("(", String.Empty).Replace(")", String.Empty).Replace(Environment.NewLine, String.Empty);
  30.         if(i < (_displayLines.Count - 1)){
  31.           builder.Append(String.Format(lineFormat, line));
  32.         }else{
  33.           builder.Append(line); //strip off the last new line
  34.         }
  35.       }
  36.  
  37.       return builder.ToString();
  38.     }
  39.    
  40.     public String GetLine(int lineNumber){
  41.       //this will throw an exception if the lineNumber exceeds the _displayLine count -1.
  42.       //Catch it here or let it go to the caller.
  43.       return _displayLines[lineNumber];
  44.     }
  45.    
  46.     public int LineCount{
  47.       get{return _displayLines.Count;}
  48.     }
  49.  
  50.   }
  51. }
  52.  


Usage

Code: [ Select ]
 
namespace Little_Utils {
  class Program {
    static void Main(string[] args) {
      DisplayBlock block = DisplayBlock.CreateInstance("this (is) an (example of what) i am (talking about)");
      Console.WriteLine("Formatted : " + block.ToString());
      Console.WriteLine("Number of Lines : " + block.LineCount);
      Console.WriteLine("Get line : " + block.GetLine(3));
    }
  }
}
 
  1.  
  2. namespace Little_Utils {
  3.   class Program {
  4.     static void Main(string[] args) {
  5.       DisplayBlock block = DisplayBlock.CreateInstance("this (is) an (example of what) i am (talking about)");
  6.       Console.WriteLine("Formatted : " + block.ToString());
  7.       Console.WriteLine("Number of Lines : " + block.LineCount);
  8.       Console.WriteLine("Get line : " + block.GetLine(3));
  9.     }
  10.   }
  11. }
  12.  


Ne pas oublier d'ajouter la référence d'espace de noms regex. Crédit à UPSGuy pour le modèle :) Peut-être plus de tuer, mais c'était amusant :D

HTH
Watch me grow
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Juillet 27th, 2009, 7:52 pm

PHP semble utiliser la même syntaxe pour regarder vers l'avenir et regarder derrière affirmations comme indiqué au cette page qui a [= acronyme Perl Compatible Regular Expression: 22tch3pp] PCRE [/acronym] écrit sur elle. (littéralement)

Quote:
LookAhead ET assertions arrières

(? =...) Semble en bonne avance
(?! ...) Rechercher négatifs à venir
(? <=...) Rechercher positives derrière
(? <!...) Rechercher négatif derrière

Chaque branche de haut niveau d'un regard en arrière doivent être d'une longueur fixe.


Je ne sais pas si l'une des autres solutions de ce fil ont travaillé, mais le code suivant m'a donné le résultat suivant ultérieures. :)
PHP Code: [ Select ]
<?php
 
$str = "this (is) an (example of what) i'm talking about. (I'll do it) This is a post-subject sentence. (and a post-subject comment)";
 
preg_match_all('#(?:\()?((?<=\()[\w\s\'-]+|[\w\'-]+)(?:\))?#', $str, $matches);
 
print_r($matches);
echo "\n";
 
?>
  1. <?php
  2.  
  3. $str = "this (is) an (example of what) i'm talking about. (I'll do it) This is a post-subject sentence. (and a post-subject comment)";
  4.  
  5. preg_match_all('#(?:\()?((?<=\()[\w\s\'-]+|[\w\'-]+)(?:\))?#', $str, $matches);
  6.  
  7. print_r($matches);
  8. echo "\n";
  9.  
  10. ?>


Code: [ Select ]
Array
(
    [0] => Array
        (
            [0] => this
            [1] => (is)
            [2] => an
            [3] => (example of what)
            [4] => i'm
            [5] => talking
            [6] => about
            [7] => (I'll do it)
            [8] => This
            [9] => is
            [10] => a
            [11] => post-subject
            [12] => sentence
            [13] => (and a post-subject comment)
        )
 
    [1] => Array
        (
            [0] => this
            [1] => is
            [2] => an
            [3] => example of what
            [4] => i'm
            [5] => talking
            [6] => about
            [7] => I'll do it
            [8] => This
            [9] => is
            [10] => a
            [11] => post-subject
            [12] => sentence
            [13] => and a post-subject comment
        )
 
)
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [0] => this
  6.             [1] => (is)
  7.             [2] => an
  8.             [3] => (example of what)
  9.             [4] => i'm
  10.             [5] => talking
  11.             [6] => about
  12.             [7] => (I'll do it)
  13.             [8] => This
  14.             [9] => is
  15.             [10] => a
  16.             [11] => post-subject
  17.             [12] => sentence
  18.             [13] => (and a post-subject comment)
  19.         )
  20.  
  21.     [1] => Array
  22.         (
  23.             [0] => this
  24.             [1] => is
  25.             [2] => an
  26.             [3] => example of what
  27.             [4] => i'm
  28.             [5] => talking
  29.             [6] => about
  30.             [7] => I'll do it
  31.             [8] => This
  32.             [9] => is
  33.             [10] => a
  34.             [11] => post-subject
  35.             [12] => sentence
  36.             [13] => and a post-subject comment
  37.         )
  38.  
  39. )


Il serait probablement plus facile, ainsi que l'utilisation moins de mémoire pour rogner l'() à partir des entrées d'une expression simple. Je ne pouvais pas laisser passer une chance de m'amuser avec des assertions. :D
Strong with this one, the sudo is.
  • Rabid Dog
  • Web Master
  • Web Master
  • Avatar de l’utilisateur
  • Inscription: Mai 21, 2004
  • Messages: 3229
  • Loc: South Africa
  • Status: Offline

Message Juillet 27th, 2009, 11:55 pm

Je ne peux m'empêcher d'ajouter une citation que j'ai lu.

Si vous utilisez regex pour résoudre un problème, vous vous retrouvez avec deux problèmes :)
Watch me grow
  • Bogey
  • Bogey
  • Genius
  • Avatar de l’utilisateur
  • Inscription: Juil 14, 2005
  • Messages: 8211
  • Loc: USA
  • Status: Offline

Message Juillet 28th, 2009, 12:05 am

Rabid Dog a écrit:
Je ne peux m'empêcher d'ajouter une citation que j'ai lu.

Si vous utilisez regex pour résoudre un problème, vous vous retrouvez avec deux problèmes :)

Ill vous donner un troisième...Je ne sais pas ce que sont ces deux :lol:
"Bring forth therefore fruits meet for repentance:" Matthew 3:8
  • spork
  • Brewmaster
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Sep 22, 2003
  • Messages: 6130
  • Loc: Seattle, WA
  • Status: Offline

Message Juillet 28th, 2009, 6:56 am

Rabid Dog a écrit:
Je ne peux m'empêcher d'ajouter une citation que j'ai lu.

Si vous utilisez regex pour résoudre un problème, vous vous retrouvez avec deux problèmes :)

:lol:

Oh vous les gars. Merci de l'aide. Ive effectivement adopté une approche différente du problème sans les expressions régulières mais je comprends tout de l'entrée.

L'expression utilisée ne vous tous, mais les exigences de ce travail sur Im peu changé...de façon spectaculaire, donc je n'ai pas besoin de plus :)
The Beer Monocle. Classy.
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Juillet 28th, 2009, 6:56 am

Afficher de l'information

  • Total des messages de ce sujet: 16 messages
  • Utilisateurs parcourant ce forum: Bigwebmaster et 150 invités
  • Vous ne pouvez pas poster de nouveaux sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas éditer vos messages
  • Vous ne pouvez pas supprimer vos messages
  • Vous ne pouvez pas joindre des fichiers
 
 

© 2011 Unmelted, LLC. Ozzu® est une marque déposée de Unmelted, LLC