2015-05-29 124 views
-4

我想匹配包含在兩個字符串中的如下任何東西:如何匹配兩個字符串之間的任何內容?

teststring = %-12x (my value) 

模式:

%-(.*?)x (my value) 

的結果應該是:

12 

但正則表達式不起作用。爲什麼?

+0

'my' VS'may'逃到'('和')'。 –

+2

使用https://regex101.com/進行測試。 「包含在兩個字符串中」 –

+0

「哪些字符串? – 2015-05-29 14:40:23

回答

2

你在你的正則表達式(而不是5月我)有一個錯字,你需要躲避()

String s = "%-12x (may value)"; 
Matcher m = Pattern.compile("%-(.*?)x \\(may value\\)").matcher(s); 
if (m.find() && m.groupCount() >= 1) System.out.println(m.group(1)); //12 
+0

謝謝你的工作,除了像'% - % - % - 12x'這樣的幾個開始字符串,我只想從最新的'%-'匹配。但目前它找到第一個.. – membersound

+1

如何:'m.group(m.groupCount())'? – assylias

+0

謝謝。是否也可以只替換找到的組(數字)? 'pattern.matcher(s).replaceAll(「100」);'將會替換完整的內容'%-12x(我的值)',而不僅僅是數字。 – membersound

1

正則表達式不起作用,因爲()是需要轉義元字符:

%-(.*?)x [(]my value[)] 

沒有[]\的引擎將它們作爲第二個捕獲組,它始終「抓住」 "my value"標記一旦成功比賽。

如果你想作適當的正則表達式爲replaceAll,除去捕獲組,並使用%-x [(]my value[)]作爲先行的一部分,並回顧後:

String s = "%-12x (my value)"; 
String r = s.replaceAll("(?<=%-).*?(?=x [(]my value[)])", "quick brown fo"); 
System.out.println(r); // prints "%-quick brown fox (my value)" 

Demo.

+0

謝謝,這是有效的,因爲它找到了完整的內容作爲匹配,不僅是數字'12', – membersound

+0

@membersound您必須提取捕獲組。 –

+0

@membersound獲取第一個[捕獲組](http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#group())將'12'拉出通過調用match.group(1)'來匹配。 – dasblinkenlight

0

看來, '?'是不需要的,因爲用'*'表示你必須有零個或更多的任何字符。

應該是這樣的%-(.*)x

相關問題