Извините, что пишу свое решение на 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])
- это группа без захвата, которая соответствует букве (перехватывается) ИЛИ цифре, поэтому, когда она соответствует букве, группа (1) не пуста
.
Флаг re.IGNORECASE позволяет обрабатывать строки прописными или строчными буквами.
.
Во второй группе я обязан написать (?:(?<=[ ,])[A-Z0-9]|\A[A-Z0-9])
, потому что утверждения с заданной длиной не фиксированной длины не допускаются.Эта часть обозначает один символ, который не может быть '-' , перед которым стоит пробел или заголовок строки.
С другой стороны, (?= |\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']