2013-11-26 68 views
0

我想在下面的字符串來識別特定的值,特別是內部價值觀和CVC號碼:如何在前瞻中添加通配符?

CreditCard Number="123" CVC="213" Date="2015-12"

(?<=CVC=\").*(?=")比賽213" Date="2015-12。我怎麼能修改正則表達式來查找第一個雙引號匹配後發現的東西,而不是像現在這樣尋找最後一個雙引號?

此外:如何在預覽中定義通配符?理想情況下,我希望有一個表達式: (?<=CreditCard.*CVC=\").*(?=")這意味着CVC語句必須以「CreditCard」字符串開頭,但在它們之間可以有任何值。

回答

4

你可以簡單地讓.*不貪.*?

(?<=CVC=\").*?(?=") 

RegExr

在回答你的第二個問題,java的正則表達式(和大多數其他引擎)不允許變長lookbehinds。通常,雖然,你可以解決這將需要一個可變長度的使用捕捉組回顧後一個問題:

(?<=CreditCard.*CVC=\").*?(?=") 

變爲:

CreditCard.*?CVC=\"(.*?)" 

然後你可以從捕獲組的相關信息1. RegExr.*在RegExr上添加,以便輸出替換整個輸入,但不是您的情況需要)

+1

的問題是,在這種情況下,你真的需要向前看/背後,還是隻能匹配'CreditCard。* CVC = \「(。*?)」'並抓取第一個捕獲組? – CompuChip

+0

當你評論時,我已經在中間編輯;) – OGHaza

+0

嗯,我想抓住雙引號內的內容。你的正則表達式可以匹配包括字符串creditCard和cvc在內的任何東西,不是嗎? – membersound

0

您可以跳過使用lookbehinds,而是使用羣集出你想要的字符串只是部分:

CreditCard Number="(/d*)".*\sCVC="(/d*)" 

,然後在「匹配組」編號1和2分別對應於你的信用卡號碼和CVC。 (您可以使用Matcher.group(int)來檢索各個組的值)請注意,通過使用\d來特別匹配數字,您不必使*非貪婪。在這種情況下,它的作用是因爲你只想匹配數字。在一般情況下(比方說,一個信用卡號碼可以由任何非引號的),你可以使用自定義字符類來匹配任何東西,但你的分隔符(在這種情況下引號):

CreditCard Number="([^"]*)".*\sCVC="([^"]*)"