2011-04-17 97 views
0

我提供的正則表達式將選擇字符串72719正則表達式,動態數

正則表達式:

(?<=bdfg34f;\d{4};)\d{0,9} 

文字示例:

vfhnsirf;5234;72159;2;668912;28032009;4; 
bdfg34f;8467;72719;7;6637912;05072009;7; 
b5g342sirf;234;72119;4;774582;20102009;3; 

我怎麼可以重寫表達式選擇,即使數量8467;改爲84677;846777;該字符串?可能嗎?

+0

你在用什麼語言? – ridgerunner 2011-04-17 14:42:29

+0

我現在不使用任何語言,我正在使用http://regexr.com?2tikn進行測試。我只是想問一下,是否可以重寫上述表達式來顯示確切的數字「72719」,但是之前是否有另一個數字。 – Aerus 2011-04-17 16:24:51

+0

我問的原因是因爲答案取決於你的語言是否支持:_variable length lookbehind_(大多數不)。如果它確實(.NET),那麼James Kyburz的解決方案將工作。如果沒有,那麼你將需要使用像我提出的解決方案。 – ridgerunner 2011-04-17 17:07:53

回答

1

首先,當問一個正則表達式問題時,你應該總是指定您正在使用的語言。 假設您使用的語言不支持可變長度lookbehind(並且大多數不支持),這裏有一個解決方案可以工作。您的原始表達式使用固定長度的lookbehind來匹配您想要的值之前的模式。但是現在這個前面的文字可能是可變長度的,所以你不能用後面的一個字眼。這沒有問題。通常簡單地匹配前面的文本並捕獲您想要保留在捕獲組中的部分。這裏是一個測試PHP代碼段,其抓住的所有值從一個字符串,捕獲每一個值到捕獲組$1

$re = '/^bdfg34f;\d{4,};(\d{0,9})/m'; 
if (preg_match_all($re, $text, $matches)) { 
    $values = $matches[1]; 
} 

的變化是:

  • 刪除了回顧後組。
  • 添加了行起始點並設置多行模式。
  • 改變了\d{4}「正好四條」\d{4,}「四個或更多的」
  • 爲所需的值添加了捕獲組。
+0

感謝您的幫助和解釋。 – Aerus 2011-04-17 21:38:32

1

下面是我通常形容一個正則表達式「田」:

[^;]+;[^;]+;([^;]+);

這意味着「東西,沒有分號,後跟一個分號」,它描述每個字段。這樣做兩次。然後第三次,選擇它。

您可能需要調整的任何一種語言,你在做這個正則表達式的語法。

而且,如果這僅僅是磁盤上的數據文件,您使用的GNU工具,有做一個更簡單的方法這樣的:

cat file | cut -d";" -f 3

+0

謝謝你的幫助。有趣的解決方案使用GNU工具,謝謝。 – Aerus 2011-04-17 20:11:35

0

這是一個簡單的文本解析的問題,可能不會強制使用正則表達式。

你可以採取通過在線和拆分輸入行「;」,即(在PHP中,我不知道你在做什麼)

foreach (explode("\n", $string) as $line) { 
    $bits = explode(";", $line); 
    echo $bits[3]; // third column 
} 

如果這確實是一個文件,你碰巧使用PHP,使用fgetcsv會好得多。

無論如何,上下文缺失,但底線是我不認爲你應該使用正則表達式。

+0

謝謝你的幫助。我會牢記在心。 – Aerus 2011-04-17 20:09:14

1

所述第一數量具有最小的4位數字

(?<=bdfg34f;\d{4,};)\d{0,9} 

和所述第一數量與1或更多長度相匹配匹配

(?<=bdfg34f;\d+;)\d{0,9} 

或僅當長度相匹配的第一個數字介於4和6之間

(?<=bdfg34f;\d{4,6};)\d{0,9} 
+0

感謝您的幫助,我在http://regexhero.net/tester/上測試了它,現在我發現它在.NET上工作。謝謝。 – Aerus 2011-04-17 20:07:39