2012-04-09 10 views
-1

Ich habe ein Zeichenketten wie dieseRegex einen String übereinstimmen, die zwei Wörter enthält

  1. Start the function "function name" (any words here ie .*) (0x10) oder
  2. 'Lets start function "function name" (any words here ie .*) (0x0B) oder etc etc ..
  3. function "function name" will start (any words here ie .*) (0x0C).

Eigentlich brauche ich eine Regulärer Ausdruck, der Start und function Wörter in einer bestimmten Reihenfolge in einer Zeichenfolge entspricht nicht notwendig, dass Start Wort sollte bei sein Der Anfang der Zeile gemäß string2
dh Start sollte das erste Vorkommen sein und function Wort sollte unabhängig von ihren Platzierungen in einer Zeichenfolge Sekunde sein.

Die dritte Zeichenfolge oben wird nicht übereinstimmen, weil Start Wort nach dem Wort function kommt. Wenn die Reg ex übereinstimmt, muss ich "function name" dh string inside double quotes und (0x10)ie hex values innerhalb () erfassen.

ich habe folgende regexp versucht, die half nicht

^(?=.*\bStart\b)(?=.*\bfunction\b)"(.*?)".*\((\b0[xX][0-9a-fA-F]+\b)\).*$

Antwort

0

ich vereinfachen würde. Sie brauchen die Lookaheads nicht.

.*\bStart\b.*\bfunction\b.*"(.*?)".*\((0[xX][0-9a-fA-F]+)\).* 

Und wenn Sie eine Suche-Funktion statt eines Spiels verwenden, können Sie wahrscheinlich die überspringen. * In Anfang und am Ende ..

Das heißt, ich bin nicht vertraut mit Perl so I‘ Ich bin mir nicht sicher, was ich gepostet habe oder wie man es in Perl findet. Vielleicht kann jemand anderes mit helfen, wenn Sie brauchen. Aber zumindest bekommst du die allgemeine Idee.

Edit: Passwort ein .* vor dem "

+0

Sie brauchen nicht die '. *' Am Anfang und Ende, sie könnten die Dinge wirklich machen, schrecklich langsam (obwohl ich in diesem Fall nicht gemessen habe). Außerdem kann ['\ b' überraschende Ergebnisse liefern] (http://blog.nu42.com/2012/04/using-b-in-regex-patterns-can-lead-to.html). –

1
#!/usr/bin/env perl 

use strict; use warnings; 

my @s = (
    'Start the function "function name" with (0x10)', 
    'Lets start function "function name" with (0x0B)', 
    'function "function name" will start with (0x0C)', 
    'Start function "API"tovalue:"Enabled"(0x01)', 
); 

for my $s (@s) { 

    my ($f, $h) = ($s =~ m{ 
      [Ss]tart 
      [ ] 
      .*? 
      function 
      [ ] 
      "([^"]+)" 
      [^(]+ 
      [(] 
      (0x[[:xdigit:]]+) 
      [)] 
     }x 
    ) or next; 

    print "Function name: '$f'. Hex value: '$h'\n"; 
} 
+0

Siehe. Wenn du die Sprache kennst, wird es viel besser! Nice one :) – barsju

+0

Hallo Sinan .. danke für die Antwort ... aber sagen Sie zum Beispiel "Start function" API "tovalue:" Enabled "(0x01)" dieser Regex passt nicht cos von Wort 'mit' Sie verwendet in die regex ... es kann alles sein .. ich habe. * statt 'mit'aber kein erfolg ... wie kann ich es allgemein zu wählen, API und 0x01 – Neha

+0

Aktualisieren Sie die Frage mit der richtigen Spezifikation. Was versuchst du zu machen? –

1

Ich denke, es klarer ist die Validierung des Strings und dem Feld Extraktion zu trennen.

Dieses Programm zeigt mein Punkt

use strict; 
use warnings; 

my @data = (
    'Start the function "function_one" with (0x10)', 
    'Lets start function "function_two" with (0x0B)', 
    'function "function_three" will start with (0x0C)', 
); 

for (@data) { 
    next unless /\bstart\b.*\bfunction\b/i; 
    printf "%s %s\n", $1, $2 if /"(.*?)".*\(0x([0-9a-f]+)\)/i; 
} 

Ausgang

function_one 10 
function_two 0B 
+0

Ich mag die Tatsache, dass Sie die beiden trennen, was macht, was Sie tun, leichter zu verstehen. Wartung ist 90% der Programmierung. –

+0

hi..Kann dies getan werden, ist Single Regex? es funktioniert auch in diesem Szenario gut "Lässt starten" function_two "Funktion mit" enable "(0x0B)" ... aber Single-Line-Regex wird groß sein – Neha

+0

Warum wollen Sie eine einzige Regex? – Borodin

Verwandte Themen