Негативный Lookbehind, чтобы исключить слово определенной длины в Java - PullRequest
0 голосов
/ 31 января 2019

У меня есть регулярное выражение как

\p{L}+[\s,،]*(خیابان)?[\s,،]*\p{L}+[\s,،]*(کوچه|کوی)?[\s,،]*\p{L}+[\s,،]*(پلاک \s*\d+)?(\s*کد پستی \s*\d{9})?

Это регулярное выражение соответствует любому латинскому символу длиной 3 или более.Как и ABC, сопоставляются ABCDE больше 3.

Все, что я хотел - это регулярное выражение, чтобы соответствовать только в случае, если латинский символ больше 6 (скажем).Я не хочу менять вышеприведенное регулярное выражение, но хочу исключить только латинские совпадения с символами меньше 6.

Поэтому я добавил Negetive Lookbehind как

(?<!\w{1,6})

Теперь регулярное выражение становится

\p{L}+[\s,،]*(خیابان)?[\s,،]*\p{L}+[\s,،]*(کوچه|کوی)?[\s,،]*\p{L}+[\s,،]*(پلاک \s*\d+)?(\s*کد پستی \s*\d{9})?(?<!\w{1,6})

Но здесь исключены все латинские символы длины.

Как добавить отрицательный вид сзади, чтобы исключить латинские символы в пределах длины от {1 до 6}?

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Умножить на 2.
2 x 3 = 6

(?:\p{L}+[\s,\u060C]*(\u062E\u06CC\u0627\u0628\u0627\u0646)?[\s,\u060C]*\p{L}+[\s,\u060C]*(\u06A9\u0648\u0686\u0647|\u06A9\u0648\u06CC)?[\s,\u060C]*\p{L}+[\s,\u060C]*(\u067E\u0644\u0627\u06A9[ ]\s*\d+)?(\s*\u06A9\u062F[ ]\u067E\u0633\u062A\u06CC[ ]\s*\d{9})?){2}

Расширенное

 (?:
      \p{L}+ [\s,\u060C]* 
      (                                              # (1 start)
           \u062E \u06CC \u0627 \u0628 \u0627 \u0646 
      )?                                             # (1 end)
      [\s,\u060C]* \p{L}+ [\s,\u060C]* 
      (                                              # (2 start)
           \u06A9 \u0648 \u0686 \u0647 
        |  \u06A9 \u0648 \u06CC 
      )?                                             # (2 end)
      [\s,\u060C]* \p{L}+ [\s,\u060C]* 
      (                                              # (3 start)
           \u067E \u0644 \u0627 \u06A9 [ ] \s* \d+ 
      )?                                             # (3 end)
      (                                              # (4 start)
           \s* \u06A9 \u062F 
           [ ] \u067E \u0633 \u062A \u06CC 
           [ ] \s* \d{9} 
      )?                                             # (4 end)
 ){2}
0 голосов
/ 31 января 2019

Вы должны использовать положительный прогноз, который проверит, что все латинские символы должны быть больше 6. Это поможет вам:

(?=\w{6,})\p{L}+[\s,،]*(خیابان)?[\s,،]*\p{L}+[\s,،]*(کوچه|کوی)?[\s,،]*\p{L}+[\s,،]*(پلاک \s*\d+)?(\s*کد پستی \s*\d{9})?
0 голосов
/ 31 января 2019

Ваше регулярное выражение не выполнено, потому что отрицательный взгляд позади проверяет только 1-6 слов в конце вашей строки.

Например, строка «A BCDEFG » имеет 7 символов, а ваш отрицательныйПосмотрите, видите, что « BCDEFG » - это 6 символов, затем исключите всю вашу строку.

Я думаю, что вы должны исправить отрицательный взгляд вот так:

(?<!^\w{1,6})

Обратите внимание«^» означает, что ваш взгляд сзади должен проверять с самого начала.

...