2012-04-09 5 views
-1

У меня есть строки, как этотRegex чтобы соответствовать строку, которая содержит два слова

  1. Start the function "function name" (any words here ie .*) (0x10) или
  2. 'Lets start function "function name" (any words here ie .*) (0x0B) или и т.д. и т.п ..
  3. function "function name" will start (any words here ie .*) (0x0C).

На самом деле, мне нужно регулярное выражение, которое соответствует Start и function слов в определенном порядке в строке, не обязательно, чтобы Start слово должно быть в начало строки согласно string2
т. е. Start должно быть первым вхождением, а слово function должно быть вторым независимо от места размещения в строке.

Третья строка выше не будет соответствовать, потому что слово Start приходит после слова function. Если Reg ex соответствует, то мне нужно записать "function name" т.е. string inside double quotes и (0x10)ie hex values внутри ().

Я попробовал следующее регулярное выражение, которое не помогло

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

ответ

0

Я бы упростить. Вам не нужны взгляды.

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

А если использовать функции поиска вместо матча, вероятно, можно пропустить. * В начале и в конце ..

Тем не менее, я не знаком с Perl, так что я» m не уверен, что я написал или как использовать find в Perl. Может быть, кто-то может помочь, если вам нужно. Но, по крайней мере, вы получите общую идею.

Edit: забудешь .* перед "

+0

Вам не нужен '. *' В начале и в конце концов, они могли бы сделать вещи действительно, ужасно медленно (хотя я не измерял в этом случае). Кроме того, ['\ b' может дать неожиданные результаты] (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

См. Когда вы знаете язык, получается намного лучше! Nice one :) – barsju

+0

Привет, Синан .. спасибо за ответ ... но скажем, например, «API запуска функции» «tovalue:« Enabled »(0x01)« это регулярное выражение не соответствует значению слова «с», которое вы использовали в регулярное выражение ... это может быть что угодно .. Я использовал. * вместо «с», но не успел ... как я могу сделать его общим для выбора API и 0x01 – Neha

+0

. Обновите вопрос с правильной спецификацией. Что ты пытаешься сделать? –

1

Я думаю, что это яснее отделить проверку строки и извлечения поля.

Эта программа показывает моя точка

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; 
} 

выход

function_one 10 
function_two 0B 
+0

Мне нравится тот факт, что вы выделяете два, что делает то, что вы делаете легче понять. Обслуживание - 90% от программирования. –

+0

hi..Can это может быть сделано одно регулярное выражение? он отлично работает в этом сценарии, а также «Позволяет запустить функцию« function_two »с« enable »(0x0B)« ... но однострочное регулярное выражение будет отличным – Neha

+0

Почему вы хотите одно регулярное выражение? – Borodin

Смежные вопросы