簡體   English   中英

未封閉字符類(正則表達式)

[英]Unclosed Character Class (Regex)

因此,我有一個半復雜的正則表達式,它在兩個字符串之間搜索所有文本,然后替換它。

我的搜索正則表達式是:

(jump *[A-Z].*)(?:[^])*?([A-Z].*:)

這在最終的結束括號中提供了一個Unclosed字符類,我一直在努力解決。 regex似乎可以在RegexR( http://regexr.com/?38k63 )上正常工作

誰能提供幫助或見解?

提前致謝。

錯誤在這里:

(jump *[A-Z].*)(?:[^])*?([A-Z].*:)
                   ^

在字符類中, ^仍然是特殊字符。 當您放置其他字符時,它通常會否定其他字符。 因此,在Java中使用\\\\對其進行轉義。

不同的正則表達式引擎將對[^]不同的處理。 有人會假設這是一個否定字符類的開始,不包括]和該模式中直到下一個]任何字符(例如[^][]將匹配除][之外的任何字符)。 其他引擎將被視為空的否定字符類(它將匹配任何內容)。 這就是為什么某些正則表達式引擎可以運行,而另一些則將其報告為錯誤的原因。

如果要讓它與文字^字符匹配,則必須像這樣轉義它:

(jump *[A-Z].*)(?:[\^])*?([A-Z].*:)

或者更好的是,只需將其從字符類中刪除(您仍然必須對其進行轉義,因為^在字符類之外也具有特殊含義):

(jump *[A-Z].*)(?:\^)*?([A-Z].*:)

或者,如果您要讓它匹配下一個[AZ].*: ,請嘗試這樣的字符類:

(jump *[A-Z].*)(?:[\s\S])*?([A-Z].*:)

當然,因為這是Java,所以不要忘記您需要對任何字符串文字中的所有\\字符進行轉義。

在使用[^]

(jump *[A-Z].*)(?:[^])*?([A-Z].*:)
                   ^
-------------------|

嘗試使用此正則表達式:

(jump *[A-Z].*)[\\s\\S]*?([A-Z].*:)

或這個:

(?s)(jump *[A-Z].*).*?([A-Z].*:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM