#java #regex #spring-boot
Вопрос:
Реализовано два метода, которые позволят искать коды стран в большом тексте. Существует карта, которая содержит ключи (затем код страны) и значения (это название страны).
Первый метод собирает коды стран и их названия — он работает:
@Test
static Map<String,String> contextLoads() {
String[] countries = Locale.getISOCountries();
var arr = new ArrayList<Countries>(countries.length);
for(String o : countries) {
arr.add(new Countries(o.toUpperCase(), new Locale("", o).getDisplayCountry()));
}
Collections.sort(arr);
var list = new HashMap<String,String>();
for(Countries c : arr) {
list.put(c.getCode(),c.getName() );
}
return Collections.synchronizedMap(list) ;
}
Второй метод должен принять текст и выполнить поиск кодов, содержащихся в Карте, и вернуть его — он не работает и выдает ошибку:
@Test
void contextShow() {
String t = "lalala "RU" bla bla ."DE" "DE" la al "UK""; // example
Map<String,String> listName = contextLoads();
String reg =String.format("^|"(%s)("|\s))", String.join("|", listName.keySet()) );
Pattern p = Pattern.compile(reg);
Matcher mat = p.matcher(t);
Set<String> countries =new HashSet<>();
while (mat.find()) {
countries.add(listName.get(mat.group(1)));
}
for(String c : countries) {
System.out.println(c);
}
}
Ошибка:
java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 756
^|"(PR|PS|PT|PW|PY|QA|AD|AE|AF|AG|AI|AL|AM|AO|AQ|AR|AS|AT|RE|AU|AW|AX|AZ|RO|BA|BB|RS|BD|BE|RU|BF|BG|RW|BH|BI|BJ|BL|BM|BN|BO|SA|BQ|SB|BR|SC|BS|SD|BT|SE|SG|BV|BW|SH|SI|BY|SJ|BZ|SK|SL|SM|SN|SO|CA|SR|CC|SS|CD|ST|SV|CF|CG|SX|CH|CI|SY|SZ|CK|CL|CM|CN|CO|CR|TC|TD|CU|TF|CV|TG|CW|TH|CX|CY|TJ|TK|CZ|TL|TM|TN|TO|TR|TT|DE|TV|TW|DJ|TZ|DK|DM|DO|UA|UG|DZ|UM|US|EC|EE|EG|EH|UY|UZ|VA|VC|ER|ES|VE|ET|VG|VI|VN|VU|FI|FJ|FK|FM|FO|FR|WF|GA|GB|WS|GD|GE|GF|GG|GH|GI|GL|GM|GN|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|YE|HU|ID|YT|IE|IL|IM|IN|IO|ZA|IQ|IR|IS|IT|ZM|JE|ZW|JM|JO|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MF|MG|MH|MK|ML|MM|MN|MO|MP|MQ|MR|MS|MT|MU|MV|MW|MX|MY|MZ|NA|NC|NE|NF|NG|NI|NL|NO|NP|NR|NU|NZ|OM|PA|PE|PF|PG|PH|PK|PL|PM|PN)("|s))
^
at java.base/java.util.regex.Pattern.error(Pattern.java:2029)
at java.base/java.util.regex.Pattern.compile(Pattern.java:1788)
at java.base/java.util.regex.Pattern.<init>(Pattern.java:1431)
at java.base/java.util.regex.Pattern.compile(Pattern.java:1070)
at com.statusinfonew.springboot.SpringBootStatusinfoApplicationTests.contextShow(SpringBootStatusinfoApplicationTests.java:75)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1510)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1510)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:84)
at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:98)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
Пожалуйста, скажите мне, в чем проблема?
И как правильно составить регулярное выражение, если коды стран в тексте заключены в кавычки, например «RU», «США», «AU»
Ответ №1:
у вас есть непревзойденное «)» в этой строке:
String reg =String.format("^|"(%s)("|\s))", String.join("|", listName.keySet()) );
Это должно быть:
String reg = String.format("^|"(%s)("|\s)", String.join("|", listName.keySet()) );
Комментарии:
1. Большое вам спасибо! Нашел это , когда писал пост:), но у меня все еще остается проблема с тем, как составить регулярное выражение, которое будет искать определенные коды в цитируемом тексте. Пожалуйста, скажи мне.
2. и как, пожалуйста, смотрите, как правильно добавить значение карты, когда вы найдете необходимый код