Refactor regex Pattern в шаблон аромата Java - PullRequest
1 голос
/ 23 мая 2019

У меня есть шаблон регулярного выражения, созданный на regex101.com: https://regex101.com/r/cMvHlm/7/codegen?language=java

, однако это регулярное выражение не работает в моей программе Java (я использую Spring toolsuite в качестве IDE):

@Test
    public void testRegex() {
        //Pattern referenceCodePattern = Pattern.compile("((\\h|\\:)+)(([\u00DFA-Za-z0-9-_#\\\\\\/])+)(([[:punct:]])?)");
        Pattern pattern = Pattern.compile(""
                + "(?:\\s+|chiffre|job-id|job-nr[.]|job-nr|\\bjob id\\b|job nr[.]|jobnummer|jobnr[.]|jobid|jobcode|job nr.|ziffer|kennziffer|kennz.|referenz code|referenz-code|"
                + "referenzcode|ref[.] nr[.]|ref[.] id|ref id|ref[.]id|ref[.]-nr[.]|ref[.]- nr[.]|"
                + "referenz nummer|referenznummer|referenz nr[.]|stellenreferenz| referenz-nr[.]|referenznr[.]|referenz|referenznummer der stelle|id#|id #|stellenausschreibungen|" 
                + "stellenausschreibungs\\s?nr[.]|stellenausschreibungs-nr[.]|stellenausschreibungsnr[.]|stellenangebots id|stellenangebots-id|stellenangebotsid|stellen id|stellen-id|stellenid|stellenreferenz|"
                + "stellen-referenz|ref[.]st[.]nr[.]|stellennumer|\\bst[.]-nr[.]\\b|\\bst[.] nr[.]\\b|kenn-nr[.]|positionsnummer|kennwort|stellenkey|stellencode|job-referenzcode|stellenausschreibung|"
                + "bewerbungskennziffer|projekt id|projekt-id|reference number|reference no[.]|reference code|job code|job id|job vacancy no[.]|job-ad-number|auto req id|job ref|\\bstellenausschreibung nr[.]\\b)"
                + ":?(?:\\w*)(?:\\s*)([A-Z]*\\s*)([!\"#$%&'()*+,\\-.\\/:;<=>?@[\\]^_`{|}~]*\\w*[!\"#$%&'()*+,\\-.\\/:;<=>?@[\\]^_`{|}~]*\\w*[!\"#$%&'()*+,\\-.\\/:;<=>?@[\\]^_`{|}~]*\\w*[!\"#$%&'()*+,\\-.\\/:;<=>?@[\\]^_`{|}~]*)?");

        String line = "Referenznummer: INDUSTRY Kontakt: ZAsdfsdfS Herr Andrafgdh Neue Str. 7 21244 Buchholz +42341 22322 mdjob.bu44lz@zaqusssis.de Stellenanzeige teilen: Jetzt online bewerben! oder bewerben Sie sich mit\n" +
            "Geben Sie bei Ihrer Bewerbung die Stellenreferenz und die Stellenbezeichnung an! \n" +
            "Stellenreferenz:   21533448-JOtest\n\n" +
            "Stellenausschreibung Nr. PD-666/19";


          // Create a Pattern object
          //Pattern r = Pattern.compile(pattern);
          Matcher m = pattern.matcher(line);
          if (m.find( )) {
             System.out.println("Found value: " + m.group(0) );
             System.out.println("Found value: " + m.group(1) );
             System.out.println("Found value: " + m.group(2) );
          }else {
             System.out.println("NO MATCH");
          }                 
    }

Я получаю следующую ошибку:

    java.util.regex.PatternSyntaxException: Unclosed character class near index 1337

    at java.util.regex.Pattern.error(Pattern.java:1957)
    at java.util.regex.Pattern.clazz(Pattern.java:2550)
    at java.util.regex.Pattern.clazz(Pattern.java:2506)
    at java.util.regex.Pattern.clazz(Pattern.java:2506)
    at java.util.regex.Pattern.clazz(Pattern.java:2506)
    at java.util.regex.Pattern.sequence(Pattern.java:2065)
    at java.util.regex.Pattern.expr(Pattern.java:1998)
    at java.util.regex.Pattern.group0(Pattern.java:2907)
    at java.util.regex.Pattern.sequence(Pattern.java:2053)
    at java.util.regex.Pattern.expr(Pattern.java:1998)
    at java.util.regex.Pattern.compile(Pattern.java:1698)
    at java.util.regex.Pattern.<init>(Pattern.java:1351)
    at java.util.regex.Pattern.compile(Pattern.java:1028)

Есть ли способ узнать, где находится индекс 1337?

1 Ответ

1 голос
/ 23 мая 2019

Основная проблема с регулярным выражением состоит в том, что и символы [ и ] должны быть экранированы в классе символов в регулярном выражении Java, поскольку они используются для формирования объединений и пересечений классов символов, которые здесь "особенные".

Другая проблема заключается в том, что шаблоны [.]\b не будут работать должным образом, поскольку граница слова после несловесного символа будет требовать слова char непосредственно справа от текущей позиции. Вам нужно \B там, а не \b.

Вам необходимо экранировать / char в шаблоне регулярных выражений Java.

Вам не нужно повторять шаблон в конце регулярного выражения, вы можете «повторить» его с ограничивающим квантификатором {0,3} после переноса повторяющегося шаблона в группу без захвата, (?:...).

Рассмотрим блок while, чтобы получить все совпадения. Вы можете использовать логический флаг, чтобы увидеть, были ли какие-либо совпадения.

Кроме того, вы, вероятно, хотите использовать альтернативу \\s+ в качестве последней в первой группе, она слишком общая, но я пока оставлю ее в начале.

Используйте

Pattern pattern = Pattern.compile(""
                + "(?:\\s+|chiffre|job-id|job-nr[.]|job-nr|\\bjob id\\b|job nr[.]|jobnummer|jobnr[.]|jobid|jobcode|job nr\\.|ziffer|kennziffer|kennz\\.|referenz code|referenz-code|"
                + "referenzcode|ref[.] nr[.]|ref[.] id|ref id|ref[.]id|ref[.]-nr[.]|ref[.]- nr[.]|"
                + "referenz nummer|referenznummer|referenz nr[.]|stellenreferenz| referenz-nr[.]|referenznr[.]|referenz|referenznummer der stelle|id#|id #|stellenausschreibungen|" 
                + "stellenausschreibungs\\s?nr[.]|stellenausschreibungs-nr[.]|stellenausschreibungsnr[.]|stellenangebots id|stellenangebots-id|stellenangebotsid|stellen id|stellen-id|stellenid|stellenreferenz|"
                + "stellen-referenz|ref[.]st[.]nr[.]|stellennumer|\\bst[.]-nr[.]\\B|\\bst[.] nr[.]\\B|kenn-nr[.]|positionsnummer|kennwort|stellenkey|stellencode|job-referenzcode|stellenausschreibung|"
                + "bewerbungskennziffer|projekt id|projekt-id|reference number|reference no[.]|reference code|job code|job id|job vacancy no[.]|job-ad-number|auto req id|job ref|\\bstellenausschreibung nr[.]\\B)"
                + ":?\\w*\\s*([A-Z]*\\s*)([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]^_`{|}~]*(?:\\w*[!\"#$%&'()*+,\\-./:;<=>?@\\[\\]^_`{|}~]*){0,3})?");

String line = "Referenznummer: INDUSTRY Kontakt: ZAsdfsdfS Herr Andrafgdh Neue Str. 7 21244 Buchholz +42341 22322 mdjob.bu44lz@zaqusssis.de Stellenanzeige teilen: Jetzt online bewerben! oder bewerben Sie sich mit\n" +
            "Geben Sie bei Ihrer Bewerbung die Stellenreferenz und die Stellenbezeichnung an! \n" +
            "Stellenreferenz:   21533448-JOtest\n\n" +
            "Stellenausschreibung Nr. PD-666/19";


Matcher m = pattern.matcher(line);
boolean found = false;
while (m.find()) {
     found = true;
     System.out.println("Found value: " + m.group(0) );
     System.out.println("Found value: " + m.group(1) );
     System.out.println("Found value: " + m.group(2) );
     System.out.println(" ----------------------- " );
}
if (!found) {
     System.out.println("NO MATCH");
}                 

См. эту демонстрацию Java .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...