2011-01-31 18 views
2

我想用正則表達式編寫程序。正如我在另一個問題中可能已經解釋的那樣,標識符的格式是它只能以一封信開始(其餘部分可以包含任何內容)。我大部分都有這部分工作。 但是,引號內的任何內容都不能作爲標識符。Java正則表達式問題 - 忽略語句

目前我使用Pattern pattern = Pattern.compile("[A-Za-z][_A-Za-z0-9]*");作爲我的模式,它表示第一個字符只能是字母。那麼我怎麼編輯這個來檢查這個單詞是否被引用包圍(並且EXCLUSE這些單詞)呢?

+0

這是舊的傳統ASCII數據,還是實際上是實際的Java字符數據,因此是正確的Unicode?信件的屬性是'\ pL`。 Java還不支持'\ p {Quotation_Mark}`屬性,所以你必須用`['''''''',''「」「<>]`拼湊一些東西,如果你變得更加困難希望它們能夠匹配,另外,Java的`\ b`完全被破壞 – tchrist 2011-02-01 00:55:22

+0

@tchrist雖然我同意你在Java中對Unicode的支持不好,但我認爲OP對Unicode不感興趣。 me * identifier *就是上述正則表達式所描述的思想,*帶引號的標識符*是U + 0022中的一個(至少在處理類似程序的數據時)。 – maaartinus 2012-08-05 02:41:41

回答

3

使用負lookaround斷言:

"(?<!\")\\b[A-Za-z][_A-Za-z0-9]*\\b(?!\")" 

例子:

Pattern pattern = Pattern.compile("(?<!\")\\b[A-Za-z][_A-Za-z0-9]*\\b(?!\")"); 
Matcher matcher = pattern.matcher("Foo \"bar\" baz"); 
while (matcher.find()) 
{ 
    System.out.println(matcher.group()); 
} 

輸出:

 
Foo 
baz 

看到它聯機工作:ideone

2

使用環視。

"(?<![\"A-Za-z])[A-Z... 

(?<![\"A-Za-z])部分的意思是「如果前面的字符不是引號或一個字母」。