Бизнес-требования:
Адрес должен быть проанализирован по улице, номеру дома и адресной строке 2
Пример однострочных адресов
Bygholm Søpark 21B,
Peder Skrams Gade 9 3. tv.,
Willemoesgade 29 kid.
Следующее регулярное выражение PCRE работает для вышеуказанного бизнес-сценария. Мне нужно использовать это регулярное выражение и создать метод Java, который принимает входной параметр (однострочный адрес) и возвращает вывод из групп регулярных выражений (улица, номер дома и адресная строка 2). Может ли кто-нибудь помочь мне с этим?
Regex:
/
\A\s*
(?: #########################################################################
# Option A: [<Addition to address 1>] <House number> <Street name> #
# [<Addition to address 2>] #
#########################################################################
(?:(?P<A_Addition_to_address_1>.*?),\s*)? # Addition to address 1
(?:No\.\s*)?
(?P<A_House_number_1>\pN+[a-zA-Z]?(?:\s*[-\/\pP]\s*\pN+[a-zA-Z]?)*) # House number
\s*,?\s*
(?P<A_Street_name_1>(?:[a-zA-Z]\s*|\pN\pL{2,}\s\pL)\S[^,#]*?(?<!\s)) # Street name
\s*(?:(?:[,\/]|(?=\#))\s*(?!\s*No\.)
(?P<A_Addition_to_address_2>(?!\s).*?))? # Addition to address 2
| #########################################################################
# Option B: [<Addition to address 1>] <Street name> <House number> #
# [<Addition to address 2>] #
#########################################################################
(?:(?P<B_Addition_to_address_1>.*?),\s*(?=.*[,\/]))? # Addition to address 1
(?!\s*No\.)(?P<B_Street_name>\S\s*\S(?:[^,#](?!\b\pN+\s))*?(?<!\s)) # Street name
\s*[\/,]?\s*(?:\sNo\.)?\s+
(?P<B_House_number>\pN+\s*-?[a-zA-Z]?(?:\s*[-\/\pP]?\s*\pN+(?:\s*[\-a-zA-Z])?)*|[IVXLCDM]+(?!.*\b\pN+\b))(?<!\s) # House number
\s*(?:(?:[,\/]|(?=\#)|\s)\s*(?!\s*No\.)\s*
(?P<B_Addition_to_address_2>(?!\s).*?))? # Addition to address 2
)
\s*\Z
https://regex101.com/library/lU7gY7
Метод JAVA:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regEx {
public static void main( String args[] ) {
// String to be scanned to find the pattern.
String line = "Bygholm Søpark 21B";
String pattern = "\\A\\s*\r\n" +
"(?: #########################################################################\r\n" +
" # Option A: [<Addition to address 1>] <House number> <Street name> #\r\n" +
" # [<Addition to address 2>] #\r\n" +
" #########################################################################\r\n" +
" (?:(?:P<A_Addition_to_address_1>.*?),\\s*)? # Addition to address 1\r\n" +
"(?:No\\.\\s*)?\r\n" +
" (?:P<A_House_number_1>\\pN+[a-zA-Z]?(?:\\s*[-\\/\\pP]\\s*\\pN+[a-zA-Z]?)*) # House number\r\n" +
"\\s*,?\\s*\r\n" +
" (?:P<A_Street_name_1>(?:[a-zA-Z]\\s*|\\pN\\pL{2,}\\s\\pL)\\S[^,#]*?(?<!\\s)) # Street name\r\n" +
"\\s*(?:(?:[,\\/]|(?=\\#))\\s*(?!\\s*No\\.)\r\n" +
" (?:P<A_Addition_to_address_2>(?!\\s).*?))? # Addition to address 2\r\n" +
"| #########################################################################\r\n" +
" # Option B: [<Addition to address 1>] <Street name> <House number> #\r\n" +
" # [<Addition to address 2>] #\r\n" +
" #########################################################################\r\n" +
" (?:(?:P<B_Addition_to_address_1>.*?),\\s*(?=.*[,\\/]))? # Addition to address 1\r\n" +
" (?:!\\s*No\\.)(?:P<B_Street_name>\\S\\s*\\S(?:[^,#](?!\\b\\pN+\\s))*?(?:<!\\s)) # Street name\r\n" +
"\\s*[\\/,]?\\s*(?:\\sNo\\.)?\\s+\r\n" +
" (?:P<B_House_number>\\pN+\\s*-?[a-zA-Z]?(?:\\s*[-\\/\\pP]?\\s*\\pN+(?:\\s*[\\-a-zA-Z])?)*|[IVXLCDM]+(?!.*\\b\\pN+\\b))(?<!\\s) # House number\r\n" +
"\\s*(?:(?:[,\\/]|(?=\\#)|\\s)\\s*(?!\\s*No\\.)\\s*\r\n" +
" (?:P<B_Addition_to_address_2>(?!\\s).*?))? # Addition to address 2\r\n" +
")\r\n" +
"\\s*\\Z";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
// Now create a matcher object.
Matcher m = r.matcher(line);
if (m.find( )) {
System.out.println("B_Street_name: " + m.group(1) );
System.out.println("B_House_number: " + m.group(2) );
System.out.println("B_Addition_to_address_2: " + m.group(3) );
}else {
System.out.println("NO MATCH");
}
}
}