不好意思在Python中編寫我的解決方案,我不知道用Java編寫足夠的Java。
pat = re.compile('(?=(?:([A-Z])|[0-9])' ## This part verifies that
'[^ ]*' ## there are at least one
'(?(1)\d|[A-Z]))' ## letter and one digit.
'('
'(?:(?<=[ ,])[A-Z0-9]|\A[A-Z0-9])' # start of second group
'[A-Z0-9-/\\\\]*'
'[A-Z0-9](?= |\Z|,)' # end of second group
')',
re.IGNORECASE) # this group 2 catches the string
。
我的解決辦法捕捉所述第二組中所希望的字符串:((?:(?<={ ,])[A-Z0-9]|\A[A-Z0-9])[A-Z0-9-/\\\\]*[A-Z0-9](?= |\Z|,))
。
之前它驗證至少一個字母和一個數字至少存在於釣到字符串中的部分:
(?(1)\d|[A-Z])
是一個條件的正則表達式,這意味着「如果基團(1)釣到的東西,那麼必須有這裏有一個數字,否則必須有一個字母」
的基團(1)是([A-Z])
在(?=(?:([A-Z])|[0-9])
(?:([A-Z])|[0-9])
是匹配的信(釣到)OR一個數字非捕獲基團,所以它匹配時一封信,該組(1)不是空的
。
標誌re.IGNORECASE允許處理帶有上下字母的字符串。
。
在第二組中,我有義務編寫(?:(?<=[ ,])[A-Z0-9]|\A[A-Z0-9])
,因爲不允許使用非固定長度的lookbehind斷言。這部分表示一個字符不能是' - '前面是空白或字符串的頭部。
在相反,(?= |\Z[,)
手段「後的字符串或逗號或空白」末端。
此正則表達式假設的字符'-'
,'/'
,'\'
不能是第一個字符或一個捕獲的字符串中的最後一個。這樣對嗎 ?
import re
pat = re.compile('(?=(?:([A-Z])|[0-9])' ## (from here) This part verifies that
'[^ ]*' # there are at least one
'(?(1)\d|[A-Z]))' ## (to here) letter and one digit.
'((?:(?<=[ ,])[A-Z0-9]|\A[A-Z0-9])'
'[A-Z0-9-/\\\\]*'
'[A-Z0-9](?= |\Z|,))',
re.IGNORECASE) # this group 2 catches the string
ch = "ALPHA13 10 ZZ 10-10 U-R open-office ,10B a10 UCS5000 -TR54 code vg4- DV-3000 SEA 300-BR gt4/ui bn\\3K"
print [ mat.group(2) for mat in pat.finditer(ch) ]
s = "A35, 35A, B503X,1ABC5 " +\
"AB-10, 10-AB, A10-BA, BA-A10, etc... " +\
"10-10, open-office, etc."
print [ mat.group(2) for mat in pat.finditer(s) ]
結果
['ALPHA13', '10B', 'a10', 'UCS5000', 'DV-3000', '300-BR', 'gt4/ui', 'bn\\3K']
['A35', '35A', 'B503X', '1ABC5', 'AB-10', '10-AB', 'A10-BA', 'BA-A10']
在未來你可以玩這個工具,它是我的救星:http://regexpal.com/ – 2011-04-20 14:35:27
什麼是你做的,不要有什麼區別不想匹配?每組必須包含字母和數字? – 2011-04-20 14:43:47
在這個字符串中:「10 10-10 open office 10B A10 UCS5000 code DV-3000 300-BR」,正則表達式需要匹配這個詞:「10B,A10,UCS5000,DV-3000,300-BR」。字母和數字在同一個詞中,用符號分隔或不用符號 - ,/,\ – 2011-04-20 14:48:36