我想用正則表達式編寫程序。正如我在另一個問題中可能已經解釋的那樣,標識符的格式是它只能以一封信開始(其餘部分可以包含任何內容)。我大部分都有這部分工作。 但是,引號內的任何內容都不能作爲標識符。Java正則表達式問題 - 忽略語句
目前我使用Pattern pattern = Pattern.compile("[A-Za-z][_A-Za-z0-9]*");
作爲我的模式,它表示第一個字符只能是字母。那麼我怎麼編輯這個來檢查這個單詞是否被引用包圍(並且EXCLUSE這些單詞)呢?
我想用正則表達式編寫程序。正如我在另一個問題中可能已經解釋的那樣,標識符的格式是它只能以一封信開始(其餘部分可以包含任何內容)。我大部分都有這部分工作。 但是,引號內的任何內容都不能作爲標識符。Java正則表達式問題 - 忽略語句
目前我使用Pattern pattern = Pattern.compile("[A-Za-z][_A-Za-z0-9]*");
作爲我的模式,它表示第一個字符只能是字母。那麼我怎麼編輯這個來檢查這個單詞是否被引用包圍(並且EXCLUSE這些單詞)呢?
使用負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。
使用環視。
"(?<![\"A-Za-z])[A-Z...
的(?<![\"A-Za-z])
部分的意思是「如果前面的字符不是引號或一個字母」。
這是舊的傳統ASCII數據,還是實際上是實際的Java字符數據,因此是正確的Unicode?信件的屬性是'\ pL`。 Java還不支持'\ p {Quotation_Mark}`屬性,所以你必須用`['''''''',''「」「<>]`拼湊一些東西,如果你變得更加困難希望它們能夠匹配,另外,Java的`\ b`完全被破壞 – tchrist 2011-02-01 00:55:22
@tchrist雖然我同意你在Java中對Unicode的支持不好,但我認爲OP對Unicode不感興趣。 me * identifier *就是上述正則表達式所描述的思想,*帶引號的標識符*是U + 0022中的一個(至少在處理類似程序的數據時)。 – maaartinus 2012-08-05 02:41:41