2011-03-18 46 views
1
Pattern patronValidity = Pattern.compile("Validity: \\[(.*?)\\]"); 
      Matcher matcherValidity = patronValidity.matcher(strCert); 
      if(matcherValidity.find()){ 
       System.out.println(matcherValidity.group(1)); 
      } 

我用它來掃描文件,但它沒有返回任何匹配。奇怪的是,下一個確實會返回一些信息,但是這是錯誤的,因爲左括號仍然保留在信息中。從數字證書中獲取java中兩個方括號之間的數據?

Pattern patronValidity = Pattern.compile("Validity: (\\[[^]]*)"); 
      Matcher matcherValidity = patronValidity.matcher(strCert); 
      if(matcherValidity.find()){ 
       System.out.println(matcherValidity.group(1)); 
      } 

這是我試圖匹配的值。

從這個去的文件中:

Validity: [From: Thu Aug 21 10:22:08 CDT 2008, 
       To: Sat Aug 21 10:22:08 CDT 2010] 

此爲從第二函數的輸出:

[From: Thu Aug 21 10:22:08 CDT 2008, 
       To: Sat Aug 21 10:22:08 CDT 2010 

第一個功能不匹配任何東西。

回答

4

在這裏你去:

Pattern patronValidity = Pattern.compile("\\[([^\\]]+)]"); 

你需要什麼這應該讓你的!

+0

它標記爲「無效的轉義序列」 – overmann 2011-03-18 00:21:56

+0

您只需要跳過斜槓 - 更新我的答案。 – 2011-03-18 00:24:07

+0

謝謝bun bun。 :) – overmann 2011-03-18 00:39:59

1

您的第一個表達式不起作用的原因是因爲.匹配但是新行字符(可能還有其他)。你需要編譯DOTALL標誌的正則表達式來匹配所有字符。第二,請看Josh的回答。

1

它是否必須是正則表達式?我可能只是使用子串來解決這種問題。

String str = "Validity: [From: Thu Aug 21 10:22:08 CDT 2008, 
       To: Sat Aug 21 10:22:08 CDT 2010]"; 
System.out.println(str.substring(
        str.indexOf('[', str.indexOf("Validity: ")), 
        str.indexOf(']')+1) 
       ); 

這應該給出想要的輸出並且更容易閱讀,更新,更改或擴展。另外我不確定在Java中有多少內存正則表達式,但是對於PHP,他們推薦使用內置的字符串函數來處理這類工作,因爲正則表達式引擎在系統上要重得多,而且速度也比較慢。

+0

這個正則表達式函數的作用就是它對這個整個文件的小字符串進行加法運算。 – overmann 2011-03-18 00:55:23

+0

使用諸如substring之類的函數絕對不會比正則表達式更具可擴展性!當你必須做任何事情時,即使是非常複雜的事情,你也會發現自己必須記下所有重要角色的位置,甚至通過字符串循環逐字符 - 它非常快速地變得非常混亂。我也沒有發現比我發佈的正則表達式更容易閱讀,但這可能是因爲我經常使用它們,習慣於語法。不要害怕正規表達,擁抱它的力量。 – 2011-03-18 05:02:40

+0

@josh我從來沒有想過它比正則表達式更具擴展性,這只是一個愚蠢的陳述,只是它清楚地顯示了你所做的事以及不知道正則表達式而得到的結果。如果你需要做一些複雜的事情,正則表達式就是要走的路,但問題並不複雜。保持簡單,不要接受超過你需要的權力;) – Flygenring 2011-03-18 11:09:47

相關問題