2016-11-23 27 views
1

我有內容的字符串:java的正則表達式 - 找到的所有元素

{1:F01[some data there]}{2:I515[some data there]}{4::[multiple data there]}{5:{TNG:}} 
{1:F01[some data there]}{2:I515[some data there]}{4::[multiple data there too]}{5:{TNG:}} 
{1:F01[some data there]}{2:I515[some data there]}{4::[some data there]}{5:{TNG:}} 

我想找到的每個記錄。記錄以{1}開始,以{5}結尾。 我已經寫了這個正則表達式:

(\{1:F01)?.*(\{2:)?.*(\{5:\{TNG:\}\})? 

但我總是得到一個包含每個記錄的全部內容。 怎麼辦?

+0

因爲'{1'和'{5'由可選的'' – nu11p01n73R

+0

您是否在尋找_match_某些記錄,或者你希望_extract_匹配的藥水?記錄? –

+0

使用更簡單的['\ {1:F01。*?\ {5:\ {TNG:}}'](https://regex101.com/r/1UOf1X/2)。 –

回答

1

.*是貪婪的,只要可能的話,將匹配和glob的可能太多記錄。

.*?將盡快停止。

這應該這樣做:

\{1:.*?\{5:\{TNG:\}\} 
+1

這確實工作完美 – XtremeBaumer

1

正則表達式匹配每一個喜歡,因爲{1{5由可選的?,並且.*將嘗試匹配一切

您可以使用一個簡單的正則表達式一樣,

/^\{1:F01.*5:\{TNG:\}\}$/gm 

Regex Demo


正則表達式解釋

  • ^錨定字符串開始處的正則表達式。

  • {1:F01.*匹配{1:F01在字符串的開頭,後面跟着任何東西。

  • 5:\{TNG:\}\}匹配字符串的末尾。

  • $錨定字符串末尾的正則表達式。

編輯

在Java中,多是使用Pattern.MULTILINE加入。如果你的輸入字符串不是多行的,你根本不需要添加這個標誌。

此外,正則表達式不需要由//分隔。

String s="{1:F01[some data there]}{2:I515[some data there]}{4::[some data there]}{5:{TNG:}}"; 
Pattern p=Pattern.compile("^\\{1:F01.*5:\\{TNG:\\}\\}$", Pattern.MULTILINE); 
Matcher m=p.matcher(s); 
System.out.println(m.matches()); 
// true 
+0

當我嘗試時這不起作用 – XtremeBaumer

+1

您可能需要一個'm'修飾符。 –

+0

@XtremeBaumer你如何輸入字符串?如果是多行輸入,則必須使用'gm'標誌 – nu11p01n73R

相關問題