Найдите в тексте конкретные значения (коды стран). Ошибка компиляции

#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. и как, пожалуйста, смотрите, как правильно добавить значение карты, когда вы найдете необходимый код