2017-03-20 39 views
1

我有以下的正則表達式是一個字符串模式匹配:Java的正則表達式:提前刪除(雙)負的外觀和向後看

(?i)(?<![^\\s\\p{Punct}]):看後面

(?![^\\s\\p{Punct}]):向前看

下面是演示我如何使用它的例子:

public static void main(String[] args) { 
    String patternStart = "(?i)(?<![^\\s\\p{Punct}])", patternEnd = "(?![^\\s\\p{Punct}])"; 
    String text = "this is some paragraph"; 
    System.out.println(Pattern.compile(patternStart + Pattern.quote("some paragraph") + patternEnd).matcher(text).find()); 
} 

它返回true預計重SULT。然而,由於regex使用雙負(即負面前瞻/後面和^),我認爲消除兩個否定應返回相同的結果。於是,我試着用下面的:

String patternStart = "(?i)(?<=[\\s\\p{Punct}])", patternEnd = "(?=[\\s\\p{Punct}])"; 

然而,它似乎並沒有被工作正常。我甚至嘗試在(方括號內)末尾添加^和/或$以匹配字符串的開始/結束,但仍然沒有運氣。

是否可以將這些regexes轉換爲正面查找?

+0

'(?= [\\ s \\ p {Punct}])''與'(?![^ \\ s \\ p {Punct}]')不一樣' – anubhava

+0

兩個否定結果爲肯定。但是,如果使用否定字符類來排除超類的子類,則需要小心。例子'[^ \ P {Punct} ,.]'另外,請注意,使用兩個底片具有傳遞錨點的隱藏優勢。所以一個空白邊界將是'(?<!\ S)'和'(?!\ S)' – sln

回答

1

是的,這是可能的,但它比你有什麼效率較低,因爲在正lookarounds你需要使用交替

String patternStart = "(?i)(?<=^|[\\s\\p{Punct}])", patternEnd = "(?=[\\s\\p{Punct}]|$)"; 
           ^^             ^^ 

(?<=^|[\\s\\p{Punct}])回顧後需要串的任一開始存在(^)或|空格或標點符號([\\s\\p{Punct}])。積極的lookahead (?=[\\s\\p{Punct}]|$)需要一個空格或標點符號或字符串的結尾。

如果你只需要添加^$到字符類,如[\\s\\p{Punct}^][\\s\\p{Punct}$],他們會被解析爲文本插入符號和美元符號。

+0

啊好吧,我試過用[[\\ s \\ p {Punct} ^]'和'[\\ s \\ p {Punct} $]'在方括號內,希望能用其他模式獲得'OR'。這一切都有道理,再次感謝:) –