2014-03-19 22 views
2

我的目標是驗證特定字符的一些文字,像(* ^,+,$,[],[^]):正則表達式:在文字中的具體角色

?test.test => true 
test.test => false 

test^test => true 
test:test => false 

test-test$ => true 
test-test => false 

我已經創建了關於上述要求的正則表達式,但我不確定在這。

^(.*)([\[\]\^\$\?\*\+])(.*)$ 

將很高興知道它是否可以這樣優化。

+1

你不需要轉義字符類的'^','''',''','*','+'。 – devnull

+0

哪種編程語言? – donfuxx

+0

我已經指定了標籤(java)。 – fashuser

回答

2

你的正則表達式已經被優化了,因爲它非常簡單。你可以使得更簡單或只讀。

此外,如果你使用Java的String類的matches()方法,那麼你就不需要在兩端的^$

.*([\\[\\]^$?*+]).* 

雙斜槓(\\)爲Java,否則請使用單斜槓(\)。

你看,我已經刪除了捕獲()與轉義字符\沿着人物^$?*+因爲它們是字符類[]內。

+0

謝謝大家的回答! – fashuser

+0

java中的'matches()'和'find()'之間是否有區別,除了添加的'^ $'?如果不是的話,你應該考慮使用'find()'並且去掉最後一個'。*'(第一個對我來說是可以爭論的,看到我的答案,但是最後一個確實沒有提供任何*目的) – Robin

+0

@Robin我沒有看到'String'類下的任何'find()'方法。 –

1

這也應該工作:

String regex = ".*[\\[\\]^$?*+].*"; 

String test1 = "?test.test"; 
String test2 = "test.test"; 
String test3 = "test^test"; 
String test4 = "test:test"; 
String test5 = "test-test$"; 
String test6 = "test-test"; 

System.out.println(test1.matches(regex)); 
System.out.println(test2.matches(regex)); 
System.out.println(test3.matches(regex)); 
System.out.println(test4.matches(regex)); 
System.out.println(test5.matches(regex)); 
System.out.println(test6.matches(regex)); 
2

TL; DR

最快的正則表達式來完成這項工作是

# ^[^\]\[^$?*+]*([\]\[^$?*+]) 

^    #start of the string 
[^    #any character BUT... 
    \]\[^$?*+ #...these ones (^$?*+ aren't special inside a character class) 
]*+    #zero or more times (possessive quantifier) 
([    #capture any of... 
    \]\[^$?*+ #...these characters 
]) 

要小心,在一個java字符串,你需要爲了逃避\,所以您應該將每個\轉換爲\\

討論

在頭兩個正則表達式來記:

  • [\]\[^$?*+],這將只匹配你想要的字符串中的字符。
  • ^.*[\]\[^$?*+],這將匹配您的字符串到所需的字符。

實際上,重要的是明白情況與.*開頭的情況和根本沒有通配符的情況之間的區別。

當圖案搜索,第一.*將使正則表達式引擎吃所有的字符串,然後原路返回字符的字符,看它是否是爲你的角色範圍[...]匹配。所以正則表達式實際上會從字符串的末尾搜索

這是一個優勢,當你想要的標誌,如果接近尾聲,當它是在開始時的缺點。

在另一種情況下,正則表達式引擎會從左邊開始嘗試每個字符,直到它匹配你想要的。

你可以明白我的意思從優秀regex101.com這兩個例子:

,如果你願意,你可以使用TL這兩種方法結合起來,醫生回答:你每天吃不是你的角色,那麼你匹配你的角色(或失敗,如果沒有)。

our example上,無論您的角色在字符串中(7步,即使沒有字符,由於佔有量詞),它都需要7個步驟。

+0

它不適合我。 – fashuser

+0

然後我猜在Java中你必須逃避'] [',這種行爲有時取決於你使用的正則表達式。 – Robin

+0

@fashuser:已編輯。這可能比你問的要多一點,但是正則表達式很有趣。 – Robin