2016-08-19 67 views
1

比賽的話,我有兩個字符串:java的正則表達式:先後與至少一位

String s1 = "The demo 505/rj is bad"; 
    String s2 = " demo zero 4"; 

String val="demo"String g = s1s2和正則表達式:

Pattern p = Pattern.compile("(?<=" + val +")\\s*\\b(?=\\D*\\d)\\S+\\b"); 
Matcher m = p.matcher(g); 
if (m.find()) { 
     String s = g.substring(m.start(), m.end()); 
     System.out.println(s); 
}  

兩種可能情況:

  • 如果g = s1s = 505/rj - 對我來說意味着p attern工作正常
  • 如果g = s2s = zero - 是壞的 - 因爲字「零」不包含至少一個數字

注:除了字母,單詞也可以包含特殊字符

哪有我修改此模式以解決案例1和2中的問題?

+0

你是什麼意思的工作都爲?你的預期產出是多少? – Pranalee

回答

1

你需要在你的正則表達式模式\S更換\D,因爲\D匹配一個非數字(所以,它相匹配的空間!)以外的任何字符,並檢查遠高於當前單詞後面的一個非空白塊。

Pattern p = Pattern.compile("(?<=" + val +")\\s*\\b(?=\\S*\\d)\\S+\\b"); 
                 ^^^^ 

this Java demo

您也可以整場比賽通過matcher.group(0)訪問它,也沒有必要使用m.start()/m.end()擺脫g一子。

這裏是一個增強:你可以擺脫回顧後(他們是昂貴的),並使用捕獲組:

Pattern p = Pattern.compile(val + "\\s*\\b(?=\\S*\\d)(\\S+)\\b"); 
          ^^^      ^^^^^^ 
//... 
String s = m.group(1); 

this updated demo

1

您可以刪除回顧後與前瞻,用懶惰的匹配和捕獲組來簡化這個正則表達式:

val + "\\s+(\\S*?\\d+\\S*?)\\s+" 
相關問題