不好意思在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