2012-12-26 46 views
0

比如我有一個字符串:正則表達式help:catch this:| TrxId = 475665 |

MsgNam=WMS.WEATXT|VersionsNr=0|TrxId=475665|MndNr=0257|Werk=0000|WeaNr=0171581054|WepNr=|WeaTxtTyp=110|SpraNam=ru|WeaTxtNr=2|WeaTxtTxt=100 111| 

,我想抓住這個:|TrxId=475665|

TrxId=後,它可以是任何數字和其中的任何量,所以正則表達式應該抓住以及:

|TrxId=111333||TrxId=0000011112222||TrxId=123|

+0

哪種語言,你在做這個?可能比正則表達式更容易/更好。 – Bojangles

+0

@JamWaffles我不認爲有更好的辦法,你可以拆分和循環陣列,但我不認爲這會是一個巨大的速度增加,因爲這個正則表達式有點O(n)其中n是字符串長度。 –

回答

4

TrxId=(\d+)

這將使一組(1)與所述TrxId。

PS:使用全局修飾符。

3

正則表達式應該看起來有點像這樣:

TrxId=[0-9]+ 

它將匹配TrxId=後跟至少一個數字。

1

Python中的一個例子解決方案:

In [107]: data = 'MsgNam=WMS.WEATXT|VersionsNr=0|TrxId=475665|MndNr=0257|Werk=0000|WeaNr=0171581054|WepNr=|WeaTxtTyp=110|SpraNam=ru|WeaTxtNr=2|WeaTxtTxt=100 111|' 

In [108]: m = re.search(r'\|TrxId=(\d+)\|', data) 

In [109]: m.group(0) 
Out[109]: '|TrxId=475665|' 

In [110]: m.group(1) 
Out[110]: '475665' 
0

你知道你的分隔符是什麼樣子,所以你並不需要一個正則表達式,你需要split。這是Perl中的一個實現。

use strict; 
use warnings; 

my $input = "MsgNam=WMS.WEATXT|VersionsNr=0|TrxId=475665|MndNr=0257|Werk=0000|WeaNr=0171581054|WepNr=|WeaTxtTyp=110|SpraNam=ru|WeaTxtNr=2|WeaTxtTxt=100 111|"; 

my @first_array = split(/\|/,$input); #splitting $input on "|" 

#Now, since the last character of $input is "|", the last element 
#of this array is undef (ie the Perl equivalent of null) 
#So, filter that out. 

@first_array = grep{defined}@first_array; 

#Also filter out elements that do not have an equals sign appearing. 

@first_array = grep{/=/}@first_array; 

#Now, put these elements into an associative array: 

my %assoc_array; 

foreach(@first_array) 
{ 
    if(/^([^=]+)=(.+)$/) 
    { 
    $assoc_array{$1} = $2; 
    } 
    else 
    { 
    #Something weird may be happening... 
    #we may have an element starting with "=" for example. 
    #Do what you want: throw a warning, die, silently move on, etc. 
    } 
} 

if(exists $assoc_array{TrxId}) 
{ 
    print "|TrxId=" . $assoc_array{TrxId} . "|\n"; 
} 
else 
{ 
    print "Sorry, TrxId not found!\n"; 
} 

上面的代碼產生預期的輸出:

|TrxId=475665| 

現在,很明顯這是比一些其他的答案比較複雜,但它也有點更強大的,它允許你搜索更多的關鍵。

如果您的密鑰出現多次,此方法確實存在潛在問題。在這種情況下,修改上面的代碼很容易,可以爲每個密鑰收集一個值爲array reference的值。

0
/MsgNam\=.*?\|(TrxId\=\d+)\|.*/ 

例如在Perl:

$a = "MsgNam=WMS.WEATXT|VersionsNr=0|TrxId=475665|MndNr=0257|Werk=0000|WeaNr=0171581054|WepNr=|WeaTxtTyp=110|SpraNam=ru|WeaTxtNr=2|WeaTxtTxt=100111|"; 
$a =~ /MsgNam\=.*?\|(TrxId\=\d+)\|.*/; 
print $1; 

將打印TrxId = 475665

+0

'。*'不是必需的!它應該是'(TrxId \ = \ d +)'只有 – Anirudha

+0

如果可能的話,我通常更喜歡保留一些副作用(例如,它不是高負載系統下的代碼,用於優化)。只是品味的問題 –