2017-08-30 28 views
3

你能幫我解決這個正則表達式。我有一個輸出看起來是這樣的:使用正則表達式提取多個值

Wed Aug 30 14:47:11.435 EDT 

    Interface : p16, Value Count : 9 
    References : 1, Internal : 0x1 
    Values : 148, 365, 366, 367, 371 
     120577, 120578, 120631, 120632 

我需要提取所有從輸出的數字。可以有更多或更少的價值,那麼現在有什麼。 到目前爲止,我有這個(但僅提取最後一個值):

\s+Values\s+:\s+((\d+)(?:,?)(?:\s+))+ 

謝謝

編輯:添加完整的輸出。

+0

可否請你讓知道爲什麼你寫的模式,而不是'\ d +'?另外,什麼是編程語言?你是否正在提取和*驗證字符串? –

+0

在那之前有一些空間,但我認爲它們與我給出的輸出不相關,這就是爲什麼我沒有把它們放在那裏的原因。此外,我寫了這種模式,因爲在輸出之前有更多的行,我不關心的行,它就像一個錨。這是完整的輸出:Wed Aug 30 14:47:11.435 EDT接口:p16,值計數:9參考:1,內部:0x1值:148,365,366,367,371 120577,120578,120631,120632(I不能把new_lines放在這個輸出中,我不知道如何) – Lucian

+0

我想你首先需要用'Values \ s +:\ s +([\ d \ s,] + )'然後分割捕獲的字符串。沒有語言標籤,不可能提供比這更多的信息。 – dawg

回答

2

假設字符串是在變量s

% regexp -inline -all {\d+} [regexp -inline {[^:]+$} $s] 
148 365 366 367 371 120577 120578 120631 120632 

即:拾取所有最後結腸和字符串(嚴格的端部之間的文本:字符的最長序列(從一組排除冒號),該字符串以字符串的末尾爲錨點)。從這段文字中,匹配所有數字組。這是與Wiktor類似的解決方案,但在第一步中使用比較複雜的模式進行比賽。如果沒有匹配,沒有問題,因爲這隻會意味着你在第二步中會得到一個空的數字列表。

文檔: regexpSyntax of Tcl regular expressions

+0

這其實更優雅,謝謝 – Lucian

+0

我想我會用'regsub'去掉部分直到最後的冒號。否則那很好。 'regexp -all-inline'模式用於選擇字符串中所有有趣的子字符串是我的最愛之一。 –

0
[0-9] 

這是隻匹配字符串中的數字的正則表達式。它匹配每個數字在那裏。

0

爲什麼不只是匹配\d+(每組一個或多個數字)?

+0

我需要那個「值」錨點,在此之前我有更多的數字。全部輸出是這樣的:星期三14年8月30日:47:11.435 EDT 接口:P16,數值COUNT:9個 參考文獻:1,內部:爲0x1 值:148,365,366,367,371 120577,120578 ,120631,120632 – Lucian

+0

@ user2493988:好的,那麼,什麼是編程語言/正則表達式庫?請使用真實輸入和語言標籤更新問題。 –

+0

TCL,我不知道正則表達式庫 – Lucian

3

由於@dawg提到,你需要在Tcl中使用兩步法,因爲它的正則表達式不允許在同一個組中存儲多個捕獲,並且它不支持\G運算符。

這裏是一個最終的解決方案:

set text {Wed Aug 30 14:47:11.435 
EDT Interface : p16, 
Value Count : 9 References : 1, Internal : 0x1 
Values : 148, 365, 366, 367, 371 
     120577, 120578, 120631, 120632} 

set pattern {\sValues\s*:\s*\d+(?:[\s,]*\d+)*} 
regexp $pattern $text match 
if {[info exists match]} { 
    set results [regexp -all -inline {\d+} $match] 
    puts $results 
} else { 
    puts "No match" 
} 

參見Tcl demo印刷148 365 366 367 371 120577 120578 120631 120632

詳細

第一匹配 operaton提取開始Values然後具有逗號或空格分隔的數字的子:

  • \s - 一個空白
  • Values - 一個Values
  • \s*:\s* - 1或多個數字
  • (?:[\s,]*\d+)* - - 包圍0+空格
  • \d+結腸的0+空格或逗號0+序列隨後與1+數字。

第二步是使用regexp -all -inline {\d+} $match提取所有1+數字的塊。

+0

謝謝你的回答,我想這會做 – Lucian

+0

啊,我沒有注意到我達到了它 – Lucian

0

假設您正在搜索字符串「Values:」後面的所有數字,並且在這些數字之後沒有任何其他數字,您可以使用通常的字符串命令來完成此操作。這將返回一個包含數字的列表:

set result [split [string map {\n ","} [string range $text [string first "Values :" $text ]+8 end] ] ","] 

從裏到外讀取它,您將搜索「Values:」字符串的索引。然後從該索引加8,直到字符串結束。然後你使用字符串映射來用逗號替換任何換行符。 最後,您使用split將字符串轉換爲列表,並使用逗號作爲分隔符。