2012-04-09 430 views
-1

字符串我有一個字符串這樣正則表達式匹配包含兩個詞

  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).

其實,我需要一個正則表達式匹配Startfunction單詞在字符串中的特定順序不需要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所以我我不知道我發佈的作品或如何在Perl中使用find。也許別人可以幫助,如果你需要。但至少,你會得到一般想法。

編輯:前"

+0

你不需要'*'在開始和結束時,他們可能會使事情真的,可怕的慢(儘管在這種情況下我沒有測量)。另外,['\ b'可以給出令人驚訝的結果](http://blog.nu42.com/2012/04/using-b-in-regex-patterns-can-lead-to.html)。 – 2012-04-09 13:54:22

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

參見。當你知道這種語言時,結果會好很多!尼斯:) – barsju 2012-04-09 12:16:49

+0

嗨思南..謝謝你的回覆......但例如說「啓動功能」API「tovalue:」Enabled「(0x01)」這個正則表達式dosn't匹配單詞'正則表達式...它可以是任何東西..我用。*代替'with'但沒有成功...我怎麼能使它一般選擇API和0x01 – Neha 2012-04-09 14:26:29

+0

用正確的規範更新問題。你想做什麼? – 2012-04-09 14:28:54

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%。 – 2012-04-09 15:32:59

+0

嗨,這可以做到的是單一的正則表達式?它在這種情況下也能正常工作「讓我們用」enable「(0x0B)」開始「function_two」函數「...但單線正則表達式將會很好 – Neha 2012-04-10 14:53:03

+0

爲什麼你想要一個正則表達式? – Borodin 2012-04-10 18:22:55