2009-04-22 117 views
2

我需要創建一個正則表達式,其允許一個字符串,以包含任意數量的:爲什麼這個Java正則表達式不起作用?

  • 字母數字字符
  • 空間
  • &

不允許其他字符。我以前RegexBuddy構建以下的正則表達式,它正常工作時,我內使用RegexBuddy測試:

\w* *\(*\)*&*\.* 

然後我用使用RegexBuddy的「使用」功能將其轉換成Java代碼,但它似乎沒有正常工作用一個簡單的測試程序:

public class RegexTest 
{ 
    public static void main(String[] args) 
    { 
    String test = "(AT) & (T)."; // Should be valid 
    System.out.println("Test string matches: " 
     + test.matches("\\w* *\\(*\\)*&*\\.*")); // Outputs false 
    } 
} 
  • 我必須承認,我有一點盲點的,當涉及到正則表達式。任何人都可以解釋爲什麼它不起作用嗎?

回答

13

正則表達式測試任意數量的空白,然後是任意數量的字母數字字符,然後是任何數量的開放式零件,然後是任何數量的緊密零件,緊接着是任意數量的&符號,然後是任意數量的週期。

你想要的是什麼......

test.matches("[\\w \\(\\)&\\.]*") 

正如mmyers提到的,這使得空字符串。如果你不希望允許空字符串...

test.matches("[\\w \\(\\)&\\.]+") 

雖然這也將允許一個字符串,它是唯一的空間,或者僅僅時期,等等。如果你想確保至少一個字母數字字符...

test.matches("[\\w \\(\\)&\\.]*\\w+[\\w \\(\\)&\\.]*") 

所以你明白什麼正則表達式說...方括號內的任何內容(「[]」)表示一組字符。所以,在「a *」表示0或更多a的情況下,[abc] *表示0個或更多個字符,其全部是a,b或c。

+5

好,但你應該提到,這允許空字符串,這可能不是他的意圖。 – 2009-04-22 16:06:15

+0

沒關係,只有當字符串不爲空時纔會進行正則表達式測試。 – 2009-04-22 16:17:49

+1

好吧,我擴大了答案,包括一些其他的選擇,並解釋它如何運作一點。 – Illandril 2009-04-22 16:18:54

4

也許我誤解了你的描述,但是你不是基本上定義了一個沒有順序而不是特定順序的字符類嗎?你的正則表達式不應該有[xxxx] +的結構,其中xxxx是你想要的實際字符?

2

正則表達式

\w* *\(*\)*&*\.* 

會給你你所描述的項目,但僅在爲了你所描述的,並且每一個可以像想盡可能多。所以「skjhsklasdkjgsh((((()))))& & & & & .....」作品,但不混合字符。

你想這樣的正則表達式:

\[\w\(\)\&\.]+\ 

這將允許所有字符的混合。

編輯:我的正則表達式知識是有限的,所以上面的語法可能不完美。

4

您的Java代碼片段與RegexBuddy中的Test選項卡之間的區別在於,Java中的matches()方法需要正則表達式匹配整個字符串,而RegexBuddy中的Test選項卡允許部分匹配。如果您在RegexBuddy中使用原始正則表達式,則會看到多個黃色和藍色突出顯示塊。這表明RegexBuddy在您的字符串中找到了多個部分匹配。爲了得到一個正確匹配match()的正則表達式,需要對其進行編輯,直到整個測試主題以黃色突出顯示,或者如果關閉突出顯示,直到Find First按鈕選擇整個文本。

或者,您可以在正則表達式的開始和結束處使用錨點\ A和\ Z來強制它匹配整個字符串。當你這樣做時,你的正則表達式總是以相同的方式運行,不管你是在RegexBuddy中測試它,還是在Java中使用matches()或其他方法。只有匹配()需要完整的字符串匹配。 Java中的所有其他Matcher方法都允許部分匹配。

相關問題